在自定义组件中使用v-model
老版本
<!-- 自定义zInput组件 -->
<template>
<input type="text" v-model="val" @input="iptInput"/>
</template>
<script>
export default {
name: "zInputOne",
props: {
value: String //在props接受父组件传递数据
},
data(){
return {
val: this.value // 内部值和value进行关联
}
},
watch: {
value(val){ // 监听父组件传递数据,更新内部值
this.val = val
}
},
methods: {
iptInput(){
// 通过$emit触发input事件,将内部值传递给给父组件
this.$emit('input', this.val)
}
}
}
</script>
v2.2.0+ 新增model属性
<template>
<input type="text" v-model="val" @input="iptInput"/>
</template>
<script>
export default {
name: "zInputTwo",
model: { // 定义model
prop: 'value', // 绑定prop传递的值
event: 'input' // 定义触发事件名称
},
props: {
value: String // 接受父组件传递的值
},
data(){
return {
val: this.value // 关联值
}
},
methods: {
iptInput(){
// 通过$emit触发input(model内定义)事件,将内部值传递给给父组件
this.$emit('input', this.val)
}
}
}
</script>
第一种实现方式弊端:只能通过定义value和触发input
第二种实现方式:可以接受任意变量,触发任意自定义事件
sync修饰符(v2.3.0+ 新增)
<template>
<input type="text" v-model="val" @input="iptInput">
</template>
<script>
export default {
name: "syncAndUpdate",
props: {
value: String
},
data(){
return {
val: this.value // 关联值
}
},
methods: {
iptInput(){
// 通过触发update:value 触发事件,将值传给父组件
this.$emit('update:value', this.val)
}
}
}
</script>
<!-- 使用 -->
<sync-and-update :value.sync="thirdValue"></sync-and-update>
sync实现的好处,可是定义多个值,进行父子组件的数据绑定。
https://www.jianshu.com/p/92d21533cef6