Skip to content

Vue 双向绑定

Vue 表单输入绑定

简介

表单输入绑定是 Vue.js 提供的一种特性,用于实现在表单元素和 Vue 实例之间建立双向绑定关系。

通过双向绑定,可以使得表单元素的值发生变化时,Vue 实例中的数据也会相应地更新,反之亦然。

Vue 提供了 v-model 的指令来实现双向绑定,语法格式如下所示:

<!-- 表单元素 绑定 Vue实例 -->
<input v-model="变量名">

文本绑定的基本用法

v-model 可以实现单行或多行文本与页面元素的双向绑定,使得数据的变化也会实时地反映在页面上,代码的实现如下所示:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <!-- 引入 Vue -->
    <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
    <script>
      // 导入 Vue 中的 createApp和ref
      const { createApp, ref } = Vue;
      // 文本、多行文本

      window.onload = function () {
        createApp({
          setup() {
            // 文本
            const oneText = ref('')
            // 多行文本
            const mulText = ref('')
            return {
              oneText,
              mulText,
            };
          },
        }).mount("#app");
      };
    </script>
  </head>
  <body>
    <div id="app">
      <!-- 文本 -->
      <p>
        <p>输入的单行文本为:
          {{oneText}}
        </p>
        <input v-model="oneText" placeholder="请输入单行文本">
      </p>
      <div>===================</div>
      <!-- 多行文本 -->
      <p>
        <p>输入的多行文本为:</p>
        <p style="white-space: pre-line;">{{mulText}}</p>
        <textarea v-model="mulText"></textarea>
      </p>
      <div>===================</div>
    </div>
  </body>
</html>

实现效果如下图所示:

表单控件的基本用法

v-model 还可用于将单选、复选框或选择器的状态绑定到页面元素上,根据所选状态的不同实时改变页面的元素。

为了展示效果,以下代码会使用 <label> 标签。通过将 for 属性设置为与任意标签的 id 属性相同的值,可以使得 <label> 与相应的标签关联起来,从而在用户点击 <label> 时触发相关联标签的事件。

实现代码如下所示:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <!-- 引入 Vue -->
    <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
    <script>
      // 导入 Vue 中的 createApp和ref
      const { createApp, ref } = Vue;
      //复选框、单选按钮、选择器

      window.onload = function () {
        createApp({
          setup() {
            // 复选框状态
            const checkState = ref()
             // 多选
            const checkMul=ref([])
            // 单选状态
            const radioState = ref()
            // 选择器
            const selectState = ref()
            return {
              checkState,
              checkMul,
              radioState,
              selectState
            };
          },
        }).mount("#app");
      };
    </script>
  </head>
  <body>
    <div id="app">
      <!-- 复选框 -->
      <p>
        <input type="checkbox" v-model="checkState" />
        <label >{{ checkState ? '选中状态' : '未选中状态' }}</label>
      </p>
      <div>===================</div>
      <!-- 多选 -->
      <p>
        <p>选择喜欢的猫:{{checkMul}}</p>
        <input type="checkbox" id="buo" value="布偶猫" v-model="checkMul">
        <label for="buo">布偶猫</label>
        <input type="checkbox" id="bs" value="英短" v-model="checkMul">
        <label for="bs">英短</label>
        <input type="checkbox" id="blue" value="蓝猫" v-model="checkMul">
        <label for="blue">蓝猫</label>
        <input type="checkbox" id="sim" value="暹罗猫" v-model="checkMul">
        <label for="sim">暹罗猫</label>
      </p>
      <div>===================</div>
      <!-- 单选按钮 -->
      <p>
        <div>已选:{{radioState}}</div>
        <input type="radio" id='A' value="A" v-model="radioState">
        <label for="A">选择A</label>
        <input type="radio" id='B' value="B" v-model="radioState">
        <label for="B">选择B</label>
        <input type="radio" id='C' value="C" v-model="radioState">
        <label for="C">选择C</label>
      </p>
      <div>===================</div>
      <!-- 选择器 -->
      <p>
        <div>已选:{{selectState}}</div>
        <select v-model="selectState">
          <option disabled value="">请选择你所在的城市</option>
          <option>北京</option>
          <option>上海</option>
          <option>广州</option>
          <option>深圳</option>
        </select>
      </p>
      <div>===================</div>
    </div>
  </body>
</html>

页面实现效果如下图所示:

修饰符

上述示例中,v-model 指令没有使用任何修饰符,所以 <input> 标签中输入的内容会自动更新。

如果需要让 <input> 标签输入的内容限制在一定的条件之后显示,就可以使用修饰符。

常用修饰符

  • .lazy:用于在事件之后进行同步。
  • .number:将用户的输入值转换为数值类型。因为在默认情况下,输入框中无论我们输入的是字母还是数字,都会被当成字符串来处理。.number 修饰符可以让在输入框中输入的数字内容自动转成数字类型。
  • .trim:自动过滤用户输入的首部和尾部的空白字符。
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
  </head>

  <body>
    <div id="app">
      <!--用于在事件之后进行同步-->
      <input type="text" v-model.lazy="lazy" />
      <h2>{{ lazy }}</h2>
      <br />
      <!-- 将用户的输入值转换成数值类型
        typeof 的作用就是用来区分数据的类型的,这里用来显示 number 这个变量值的类型。-->
      <input type="text" v-model.number="number" />
      <h2>{{typeof number}}</h2>
      <br />
      <!--自动过滤用户输入的首部和尾部的空白字符-->
      <input type="text" v-model.trim="trim" />
      <h2>空格{{ trim }}空格</h2>
      <br />
    </div>
  </body>
</html>
<script>
  const { createApp, ref } = Vue;
  createApp({
    data() {
      return { msg: "", lazy: "", number: "", trim: "" };
    },
  }).mount("#app");
</script>

查看页面效果如下图所示:

在这个示例中,<input> 输入框使用了 lazy 修饰符,在失去鼠标焦点之后,才会同步内容。

number 修饰符的 <input> 框会将数字识别为 number 类型,如果没有用修饰符,即使输入了数字,识别的也只会是 string 类型。

trim 修饰符的 <input> 框会自动将前后的空格去掉。

总结

本节介绍了 v-model 双向绑定的使用方式。结合 v-bind 可以实现对值的绑定,同时结合修饰符可以更加灵活地控制表单元素的显示状态。