在父子组件的通信中,为了防止子组件不小心改变父组件的状态,而导致数据流的冗余复杂、不易理解,所以vue规定了单向数据流,父组件的prop更新在子组件中会同时响应,而反过来则不能。但是我们依然可以通过v-model来实现数据的双向绑定。
v-model一般用在表单绑定数据,如:
<input v-model="value">
等同于:
<input
:value="inputValue"
@input="value => {inputValue=value}">
因此,在自定义组件中使用
v-model
指令,那么就意味着:
- 接收一个
propvalue
- 触发
事件,并传入新值input
利用 $emit 触发 input 事件:
this.$emit('input', value);
第一种:
子组件
1 <template>
2 <div>
3 // 使用时有v-model属性,value默认值‘child’ 不会被渲染,而是v-model绑定的parent值被渲染,这儿value会被赋值为v-model绑定的parent的值。
4 <p>{{value}}</p>
5 <button @click="changeValue">在子组件内修改v-model值,并且动态响应给父组件</button>
6 </div>
7 </template>
8 <script>
9 export default {
10 props: {
11 value: { // 必须要使用value
12 default: 'child',
13 },
14 },
15 methods: {
16 changeValue () {
17 let newValue = '2'
18 this.$emit('input',newValue) // 这儿必须用input 发送数据,发送的数据会被父级v-model=“parent”接收到,再被value=parent传回来。
19 }
20 }
21 }
该方法,一定要注意,props的值一定要定义为‘value’,不然不起作用,提交给父组件的事件名为‘input’
第二种(官网推荐的方法)
子组件
1 <template>
2 <div>
3 <p>{{parentProp}}</p>
4 <button @click="changeValue">在子组件内修改prop值</button>
5 </ul>
6 </div>
7 </template>
8
9 <script>
10 export default {
11 model: { // 使用model, 这儿2个属性,prop属性说,我要将msg作为该组件被使用时(此处为aa组件被父组件调用)v-model能取到的值,event说,我emit ‘cc’ 的时候,参数的值就是父组件v-model收到的值。
12 prop: 'parentProp',
13 event: 'change'
14 },
15 props: {
16 msg: ''
17 },
18 methods: {
19 changeValue () {
20 this.$emit('change', this.parentProp++)
21 }
22 }
23 }
24 </script>
在父组件引用:
<child v-model="parent"></child>
总结:当然实现父子组件的双向绑定,还有其他方案;
例如:通过vuex状态管理、使用.sync修饰符等。
如有错误,请友情指出,好人一生平安~~
转载于:https://www.cnblogs.com/sansgun/p/9254575.html