Vue数据双向绑定.sync 和v-model

举报
彭世瑜 发表于 2021/08/14 01:14:46 2021/08/14
【摘要】 结论: .sync 和v-model两者的本质都是语法糖, 目的都是实现组件与外部数据的双向绑定。 v-model 是 .sync的一种体现。.sync 比较灵活;v-model较单一 .sync修饰符 父组件 <comp :foo.sync="bar" ></comp> // 等价于, 组件属性名称一致,默认事件update <c...

结论:
.sync 和v-model两者的本质都是语法糖,
目的都是实现组件与外部数据的双向绑定。
v-model 是 .sync的一种体现。.sync 比较灵活;v-model较单一

.sync修饰符

父组件

<comp :foo.sync="bar" ></comp>

// 等价于, 组件属性名称一致,默认事件update
<comp :foo="bar" @update:foo="val => bar = val"></comp>

  
 
  • 1
  • 2
  • 3
  • 4

子组件代码

<input :value="foo" @change="$emit("update:foo", $event.target.value)">

  
 
  • 1

v-model

父组件

<input v-model="something" />

// 等价于, 默认prop是value, 默认行为是input
<input v-bind:value="something" v-on:input="something = arguments[0]"/>

  
 
  • 1
  • 2
  • 3
  • 4

子组件

<input :value="value" @input="$emit('input', $event.target.value)">

  
 
  • 1

可以修改默认行为

model: { prop: 'checked', event: 'change'
}

  
 
  • 1
  • 2
  • 3
  • 4

v-model实例

app.vue

<template> <div> <p>父组件:{{value}}</p> <child v-model="value"/> <!-- 两者等效value, input --> <child v-bind:value="value" v-on:input="value = arguments[0]" /> </div>
</template>

<script>
import child from './Child.vue';

export default { components:{ child }, data(){ return { value: "" } }
}
</script>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

Child.vue

<template>
  <div> 子组件: <input type="text" :value="value" @input="$emit('input', $event.target.value)" />
  </div>
</template>

<script>
export default {
  props: ["value"]
};
</script>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

运行 vue serve app.vue

在这里插入图片描述
修改子组件Child.vue中 model对应的属性和事件,
属性修改为 : foo
事件修改为:change

<template>
  <div> 子组件: <input type="text" :value="foo" @input="$emit('change', $event.target.value)" />
  </div>
</template>

<script>
export default {
  props: ["foo"], model:{ props: "foo", event: "change" }
};
</script>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

父组件app.vue 需要修改为

<!-- v-model写法不用变 -->
<child v-model="value"/> <!-- 两者等效,需要修改下面的代码 -->

<child v-bind:foo="value" v-on:change="value = arguments[0]" />

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

.sync实例

app.vue

<template> <div> <p>父组件:{{value}}</p> <child :foo.sync="value"/> <!-- 两者等效 --> <child v-bind:foo="value" v-on:update:foo="val => foo = value" /> </div>
</template>

<script>
import child from './Child.vue';

export default { components:{ child }, data(){ return { value: "" } }
}
</script>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
<template>
  <div> 子组件: <input type="text" :value="foo" @input="$emit('update:foo', $event.target.value)" />
  </div>
</template>

<script>
export default {
  props: ["foo"]
};
</script>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

同样实现了v-model的效果
在这里插入图片描述

参考
Vue中.sync和v-model的区别
什么时候用组件的.sync修饰符,什么时候用自定义组件的v-model,两者有什么区别?

文章来源: pengshiyu.blog.csdn.net,作者:彭世瑜,版权归原作者所有,如需转载,请联系作者。

原文链接:pengshiyu.blog.csdn.net/article/details/102907747

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。