v-model实现父子组件间的双向绑定
2020-02-11 本文已影响0人
zzyo96
原文地址:https://www.cnblogs.com/elsonww/p/11305806.html
参考文档:https://cn.vuejs.org/v2/api/#model
背景:在工作中封装组件的时候有用到双向绑定
// 父组件
<template>
<div id="app">
// 使用 input 组件,使用 v-model
<sp-input v-model="value"></sp-input>
<button @click="Console">显示value</button>
</div>
</template>
<script>
import input from "../src/components/input";
export default {
name: "App",
data() {
return {
// 定义 input 需要的 value属性
value: ''
};
},
components: {
"sp-input": input
},
methods: {
Console() {
console.log(this.value)
alert(this.value);
}
}
};
</script>
//子组件
<template>
<div>
// 封装 input 标签,v-model绑定computed属性
<input type="text" v-model="InputValue" /
</div>
</template>
<script>
export default {
name: "sp-input",
// 定义model属性
model: {
// prop即 父组件使用 v-model 绑定的属性,这个名称是自定义的
prop: "value",
// event即 子组件会向父组件触发的事件,父组件的 v-model可以监听到这个事件,并将vlaue赋值给v-model绑定的属性
event: "input"
},
props: {
// 这里的 prop 定义必须与 model中定义的 prop 同名
value: String
},
computed: {
// 定义一个计算属性,给子组件的 v-model使用
InputValue: {
// 计算属性的 get 返回父组件传入的 value,即model,props中定义的 prop
get() {
return this.value;
},
set(value) {
//向父组件触发事件,此事件为model中定义的event,子组件v-model绑定了该计算属性,输入时会触发计算属性的set方法,即向父组件触发该事件
this.$emit("input", value);
}
}
}
};
</script>