v-model 详解

909 阅读2分钟
  • 在 Vue 中,v-model 是一个非常重要的指令,用于创建数据双向绑定。它在表单输入、选择器、复选框等表单控件元素上创建双向数据绑定,将表单上的值与应用状态绑定起来,实现视图与数据的自动同步。以下是关于 v-model 的详细讲解:

基本用法

  • 文本框:在 <input type="text"> 元素上使用 v-model,可以将输入框的值与数据对象的属性进行绑定。例如:

    <input v-model="message" placeholder="输入内容">
    

    这里 message 是 Vue 实例中的一个数据属性。当用户在输入框中输入内容时,message 的值会实时更新为输入框中的内容;反之,如果通过代码修改了 message 的值,输入框中显示的内容也会相应更新。

  • 复选框:对于单个复选框,v-model 绑定的值通常是 truefalse。例如:

    <input type="checkbox" v-model="checked">
    

    当复选框被勾选时,checked 的值为 true;未勾选时,checked 的值为 false。如果是多个复选框绑定到同一个数组,那么数组中的元素对应被勾选的复选框的值。例如:

    <input type="checkbox" v-model="checkedNames" value="Alice">
    <input type="checkbox" v-model="checkedNames" value="Bob">
    

    这里 checkedNames 是一个数组,当勾选了值为 "Alice" 的复选框时,checkedNames 数组中会包含 "Alice" 这个元素。

  • 单选按钮v-model 绑定的值是被选中的单选按钮对应的值。例如:

    <input type="radio" v-model="picked" value="One">
    <input type="radio" v-model="picked" value="Two">
    

    当用户点击第一个单选按钮时,picked 的值会变为 "One";点击第二个单选按钮时,picked 的值会变为 "Two"。

  • 选择框:对于 <select> 元素,v-model 绑定的值是被选中的 <option> 的值。例如:

    <select v-model="selected">
      <option disabled value="">请选择</option>
      <option>A</option>
      <option>B</option>
      <option>C</option>
    </select>
    

    当用户在下拉菜单中选择某个选项时,selected 的值会更新为该选项的值。

原理

v-model 本质上是语法糖,它背后做了两件事:

  1. 将输入框的值绑定到表达式的值上:通过 :value 指令实现。例如在 <input v-model="message"> 中,相当于 <input :value="message">,这样输入框的初始值会设置为 message 的值。
  2. 为输入框添加一个事件监听器:当输入框的值发生变化时,会更新表达式的值。对于文本框,是监听 input 事件;对于复选框和单选按钮,是监听 change 事件。例如在 <input v-model="message"> 中,相当于 <input :value="message" @input="message = $event.target.value">,当用户输入内容时,会触发 input 事件,然后将输入框的值更新到 message 中。

修饰符

v-model 还有一些修饰符可以用来定制行为:

  • .lazy:默认情况下,v-model 在输入框内容变化时即刻更新数据。使用 .lazy 修饰符后,会变为在 change 事件触发时才更新数据。例如:

    <input v-model.lazy="msg">
    

    这样只有当输入框失去焦点或用户按下回车键时,msg 的值才会更新。

  • .number:自动将用户的输入值转换为数值类型。例如:

    <input v-model.number="age">
    

    即使用户输入的是字符串形式的数字,如 "18",age 的值也会被转换为数值 18。

  • .trim:自动去除用户输入的首尾空白字符。例如:

    <input v-model.trim="msg">
    

    如果用户输入的是 " hello ",msg 的值会被设置为 "hello"。

注意事项

  1. 避免在同一个元素上同时使用 v-modelvalue:因为 v-model 本身就会绑定 value,如果同时使用可能会导致冲突。例如不要写 <input v-model="message" :value="otherValue">
  2. 在自定义组件上使用 v-model:在自定义组件上使用 v-model 时,需要在组件内部通过 props 接收外部传入的值,并通过 $emit 触发事件来更新外部的值。例如:
    <!-- 父组件 -->
    <my-component v-model="parentValue"></my-component>
    
    // 子组件 my-component
    export default {
      props: ['value'],
      methods: {
        updateValue(newValue) {
          this.$emit('input', newValue);
        }
      }
    }
    
    这样在子组件内部可以通过 this.value 获取到 parentValue 的值,当需要更新 parentValue 时,通过 this.$emit('input', newValue) 触发事件,父组件中的 parentValue 就会更新为 newValue

v-model 是 Vue 中实现表单数据双向绑定的核心指令,通过它可以非常方便地将表单元素与数据进行绑定,使得数据的读取和更新更加直观和高效。