双向数据绑定与父子组件通信:v-model与.sync详解

v-model

  • v-model能够实现双向数据绑定(数据model改变会自动响应到UI层,UI层的数据改变能够同步到model层),一般用在表单的双向数据绑定。
  • v-model会忽略所有表单元素的 valuecheckedselected 特性的初始值而总是将 Vue 实例的数据作为数据来源。
---在表单上---
<input v-model="searchText"/>
等价于:
<input :value="searchText" @input="search=$event.target.value">

---在组件上---
<Son :value="searchText" @input="fatherChange"/>  

Vue.component('Son',{
    props:['value'],
    template:`
     <input :value="value" @input="$emit('input',$event.target.value)">
    `
    //$event.target.value将作为父组件fatherChange()的第一个参数;
})

.sync修饰符

- .sync主要用来实现父子组件间数据的双向传递。

  • vue 中是不推荐使用双向数据传递的,因为子组件可以修改父组件,且在父组件和子组件都没有明显的改动来源,会带来维护上的问题。
  • 本质还是个语法糖但是有局限性
  • 适用于:触发事件返回的值 正是 属性要改的值,一般是单一属性。比如触发事件返回的值正好就是提title的新值
  • 更多逻辑的话,就不适用了
  • 更适用于:非表单类的组件
---在没有.sync时,使用如下方式实现子组件修改父组件的数据---
<Son :title="Father.title" @update:title="fatherChange"/>

Vue.component('Son',{
    props:['title'],
    template:`
        <div @click="$emit('update:title',newTitle)">{{title}}</div>  
    `
     // newTitle将作为父组件fatherChange()的第一个参数;
})

---.sync修饰符---
<Son :title.sync="Father.title"/>   //无需再监听update:value事件,但子组件需派发对应的自定义事件

Vue.component('Son',{
    props:['title'],
    template:`
        <div @click="$emit('update:title',newTitle)">{{title}}</div>
    `
})

总结

  • v-model默认情况下为value+input的组合,.sync为任意组合。
  • v-model 常用在表单中;.sync 主要用在父子组件通信中,子组件需要修改父组件数据时。
  • v-model不能修改外部传进来的props,如果要实现props的双向数据绑定,则需要使用.sync。
  • 可以将 v-model 理解成.sync 的一种特殊情况,二者底层的实现机制类似;v-model 做了数据传递+修改的工作;.sync 更多的是数据传递,修改需要交给用户自己。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
v-model和.sync都是用于实现双向数据绑定的语法糖,但是它们有一些区别。 1. 作用范围: v-model主要用于表单元素的双向数据绑定,而.sync修饰符可以应用于自定义组件中的任意属性。 2. 语法形式: v-model使用简单的指令形式,例如`<input v-model="data">`,而.sync修饰符需要在自定义组件的属性前面加上`.sync`修饰符,例如`<my-component :custom-prop.sync="data">`。 3. 数据流动: v-model通过在子组件中使用`$emit`来改变父组件中的数据,而.sync修饰符则是通过父组件传递一个名为`update:propName`的自定义事件给子组件,子组件修改数据时触发该事件来改变父组件中的数据。 总的来说,v-model适用于简单的双向数据绑定,而.sync修饰符则适用于自定义组件中的双向数据绑定。这样可以更加灵活地在父子组件之间进行数据的传递和同步。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [详解VUE自定义组件中用.sync修饰符与v-model的区别](https://download.csdn.net/download/weixin_38629391/12758140)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [下班前几分钟,我弄清了v-model与.sync的区别](https://blog.csdn.net/qq_41809113/article/details/125467297)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值