• v-model和.sync的区别


    1. v-model和.sync的基本概念

    v-model和.sync是Vue中两种双向绑定的方式,可以实现输入控件与Vue实例中数据的双向同步。v-model是Vue中最常用的指令之一,它可以在 input、textarea、select、checkbox、radio等表单元素上创建双向数据绑定。而.sync则是Vue提供的一种语法糖,它可以简化子组件中通过 $emit 触发父组件事件,并传递数据的过程,使得代码更加简洁易读。

    2. v-model和.sync的语法和用法

    2.1 v-model

    v-model可用于input、textarea、select、radio、checkbox等表单元素上,它的语法格式为:

    1. <input v-model="value">
    2. <textarea v-model="value">textarea>
    3. <select v-model="value">
    4.   <option v-for="option in options" :value="option.value">{{ option.label }}option>
    5. select>
    6. <input type="radio" v-model="radioValue" value="1">
    7. <input type="checkbox" v-model="checkedValue" value="1">

    其中value是Vue实例中定义的数据,v-model会将表单元素上的值与value进行双向绑定。

    2.2 .sync

    .sync是Vue2.3版本以后新增的语法糖,其主要作用是简化子组件中通过 $emit 触发父组件事件,并传递数据的过程。其语法格式为:

    1. // 父组件模板
    2. <child :value.sync="parentValue">child>
    3. // 子组件模板
    4. <template>
    5.   <input :value="innerValue" @input="updateValue($event.target.value)">
    6. template>
    7. <script>
    8.   export default {
    9.     props: ['value'],
    10.     computed: {
    11.       innerValue: {
    12.         get () {
    13.           return this.value
    14.         },
    15.         set (val) {
    16.           this.$emit('update:value', val)
    17.         }
    18.       }
    19.     },
    20.     methods: {
    21.       updateValue (val) {
    22.         this.$emit('update:value', val)
    23.       }
    24.     }
    25.   }
    26. script>

    其中,父组件将数据传入子组件的 value 属性上,子组件通过计算属性 innerValue 将其转化为内部使用的数据,并在 input 事件触发时,通过 $emit 触发 update:value 事件,并传递数据 val 给父组件。

    在父组件模板中使用 .sync 修饰符后,Vue会自动将子组件触发的 update:value 事件转化为属性更新事件。因此,当子组件触发 update:value 事件时,父组件中的 value 属性会自动更新。

    3. v-model和.sync的异同点

    3.1 相同点

    v-model和.sync都可以实现输入控件与Vue实例中数据的双向同步,都能够使得数据的读取和更新变得非常简单。

    3.2 不同点

    3.2.1 用法不同

    v-model可以直接应用于表单元素(input、textarea、select、radio、checkbox等),而.sync需要通过子组件传递父组件数据。

    3.2.2 需要添加事件处理

    在使用.sync时,需要在子组件中手动添加 update:value 事件处理函数来触发父组件事件。而v-model则不需要,因为Vue已经内置了对v-model指令的处理。

    3.2.3 适用场景不同

    v-model适用于简单场景下的单向或双向绑定。而.sync适用于复杂业务场景下的多层嵌套组件之间的数据传递。

    4. v-model和.sync的应用举例

    下面通过实例来说明v-model和.sync的应用。

    4.1 v-model的应用

    1. <template>
    2.   <div>
    3.     <h3>请输入用户名:h3>
    4.     <input v-model="username" placeholder="请输入用户名">
    5.     <h3>请输入密码:h3>
    6.     <input type="password" v-model="password" placeholder="请输入密码">
    7.     <button @click="login">登录button>
    8.   div>
    9. template>
    10. <script>
    11.   export default {
    12.     data () {
    13.       return {
    14.         username: '',
    15.         password: ''
    16.       }
    17.     },
    18.     methods: {
    19.       login () {
    20.         if (this.username === 'admin' && this.password === '123456') {
    21.           alert('登录成功!')
    22.         } else {
    23.           alert('用户名或密码错误!')
    24.         }
    25.       }
    26.     }
    27.   }
    28. script>

    在上述代码中,v-model分别绑定了用户名和密码的input元素,实现了输入框中内容与Vue实例中数据的双向绑定。当用户点击登录按钮时,通过比对用户名和密码是否正确来显示登录成功或失败的提示。

    4.2 .sync的应用

    在这个例子中,有两个组件:一个父组件和一个子组件,父组件通过props属性传递了一组数据给子组件,并使用了.sync修饰符来实现了子组件数据的双向绑定。

    1. // 父组件模板
    2. <template>
    3.   <div>
    4.     <h3>父组件h3>
    5.     <p>父组件数据:{{ parentData }}p>
    6.     <child :child-data.sync="parentData">child>
    7.   div>
    8. template>
    9. <script>
    10.   import Child from './Child.vue'
    11.   export default {
    12.     components: {
    13.       Child
    14.     },
    15.     data () {
    16.       return {
    17.         parentData: 'hello'
    18.       }
    19.     }
    20.   }
    21. script>
    22. // 子组件模板
    23. <template>
    24.   <div>
    25.     <h3>子组件h3>
    26.     <p>子组件数据:{{ childData }}p>
    27.     <input v-model="childData">
    28.   div>
    29. template>
    30. <script>
    31.   export default {
    32.     props: ['childData'],
    33.     // 注意:computed属性名必须是value,否则会出现编译错误
    34.     computed: {
    35.       value: {
    36.         get () {
    37.           return this.childData
    38.         },
    39.         set (newValue) {
    40.           this.$emit('update:childData', newValue)
    41.         }
    42.       }
    43.     }
    44.   }
    45. script>

    在上述代码中,父组件传递了一个叫做parentData的数据给子组件,并使用了.sync修饰符。子组件通过props接收到父组件传递过来的数据,并通过computed属性将其转化为内部使用的数据childData,并在input事件触发时,通过 $emit 触发 update:childData 事件,并传递数据 newValue 给父组件。

    当子组件触发 update:childData 事件时,父组件中的 parentData 属性会自动更新,从而实现了子组件和父组件间的数据双向同步。

    5. 总结

    v-model和.sync是Vue中两种常用的双向绑定方式,它们都可以使得输入控件与Vue实例中数据的双向同步。v-model可以应用于简单场景下的单向或双向绑定,而.sync适用于复杂业务场景下的多层嵌套组件之间的数据传递。在使用.sync时,需要在子组件中手动添加 update:value 事件处理函数来触发父组件事件。在实际开发中,可以根据业务场景的不同来选择使用v-model或.sync来实现双向绑定,让代码变得更加简洁、易读。

  • 相关阅读:
    realloc函数应用&IO泄露体验
    np.where()用法解析
    开启金融之门,一切皆有可能——人大女王金融硕士项目助您成就辉煌
    linux命令总结
    【网工】华为设备命令学习(防火墙)
    arduino(esp8266)驱动74hc595进行流水灯异常一例
    【Cortex-M4】学习 Day1 搭建开发环境
    yara
    39.克鲁斯卡尔(Kruskal)算法
    了解IO,内外存,文件操作这一篇就够了
  • 原文地址:https://blog.csdn.net/m0_72196169/article/details/134022199