Vue-父子组件通信

1. 场景

  在Vue前端开发过程中,经常会遇到组件通信的问题,如父组件传递值给子组件,或者子组件向父组件传递值,下面介绍一个组件之间如何进行通信;

2. 组件通信

2.1 父组件与子组件通信

  父组件向子组件通信的方式有两种:

  • 直接传值,使用v-bind:data="data";
  • 通过使用子组件的方法,传递值,this.$refs.sunVueRef.method(param1,param2);
  • 通过使用子组件的属性,传递值,this.$refs.sunVueRef.param = value;

2.1.1 直接传值

(1)创建父组件,同时在父组件引入子组件;

 1 <template>
 2   <div>
 3     <span>向子组件传递值:</span>
 4     <el-input v-model="msg" size="mini" class="w100"></el-input>
 5     <div style="padding-top: 30px">
 6       <sunVue :msg="msg"></sunVue>
 7     </div>
 8   </div>
 9 </template>
10 
11 <script>
12   import sunVue from './sun'
13 
14   export default {
15     name: '',
16     components: {
17       sunVue
18     },
19     data () {
20       return {
21         msg: '传递给子组件显示'
22       }
23     }
24   }
25 </script>

 

(2)创建子组件,使用props接收;

 1 <template>
 2   <div>
 3     <span>显示父组件传递的值:</span>
 4     <span>{{msg}}</span>
 5   </div>
 6 </template>
 7 
 8 <script>
 9   export default {
10     name: '',
11     props: {
12       msg: String,
13       default: function () {
14         return ''
15       }
16     }
17   }
18 </script>

 

(3)效果

  • 初始效果

 

 

  •  当在输入框输入内容后,

 

(4)关键代码

  • 父组件传值:
1 <sunVue :msg="msg"></sunVue>
  • 子组件接收值:
1     props: {
2       msg: String,
3       default: function () {
4         return ''
5       }
6     }

 

2.1.2 通过使用子组件的方法($refs)

(1)创建父组件,引入子组件;

 1 <template>
 2   <div>
 3     <span>向子组件传递值:</span>
 4     <el-input v-model="msg" size="mini" class="w100" type="text" @change="changeSunMsg"></el-input>
 5     <div style="padding-top: 30px">
 6       <sunVue ref="sunVueRef"></sunVue>
 7     </div>
 8   </div>
 9 </template>
10 
11 <script>
12   import sunVue from './sun'
13 
14   export default {
15     name: '',
16     components: {
17       sunVue
18     },
19     data () {
20       return {
21         msg: ''
22       }
23     },
24     methods: {
25       changeSunMsg (msg) {
26         this.$refs.sunVueRef.initMsg(msg);
27       }
28     }
29   }
30 </script>

 

(2)创建子组件,定义方法;

 1 <template>
 2   <div>
 3     <span>显示父组件传递的值:</span>
 4     <span>{{msg}}</span>
 5   </div>
 6 </template>
 7 
 8 <script>
 9   export default {
10     name: '',
11     data () {
12       return {
13         msg: ''
14       }
15     },
16     methods: {
17       initMsg (msg) {
18         this.msg = msg
19       }
20     }
21   }
22 </script>

 

(3)效果

  • 初始效果

     

     

  • 输入内容

 

 

 

 

(4)关键代码

  • 父组件使用子组件的方法:
1     methods: {
2       changeSunMsg (msg) {
3         this.$refs.sunVueRef.initMsg(msg);
4       }
5     }

 

2.1.3 父组件给子组件属性赋值

  也可直接在父组件中修改子组件的属性,也可以实现传值:

1     methods: {
2       changeSunMsg (msg) {
3         this.$refs.sunVueRef.msg = msg
4       }
5     }

 

2.2 子组件与父组件通信

  子组件与父组件通信使用$emit,子组件调用父组件的方法;

(1)创建父组件;

 1 <template>
 2   <div>
 3     <span>显示字组件的值:</span>
 4     <span>{{msg}}</span>
 5     <div style="padding-top: 30px">
 6       <sunVue ref="sunVueRef" @getSubValue="getSubValue"></sunVue>
 7     </div>
 8   </div>
 9 </template>
10 
11 <script>
12   import sunVue from './sun'
13 
14   export default {
15     name: '',
16     components: {
17       sunVue
18     },
19     data () {
20       return {
21         msg: ''
22       }
23     },
24     methods: {
25       getSubValue (msg) {
26         this.msg = msg
27       }
28     }
29   }
30 </script>

(2)创建子组件,使用父组件方法传值;

 1 <template>
 2   <div>
 3     <span>修改父组件的值:</span>
 4     <el-input v-model="msg" size="mini" class="w100" type="text" @change="changeMsg"></el-input>
 5   </div>
 6 </template>
 7 
 8 <script>
 9   export default {
10     name: '',
11     data () {
12       return {
13         msg: ''
14       }
15     },
16     methods: {
17       changeMsg (msg) {
18         this.$emit('getSubValue',msg);
19       }
20     }
21   }
22 </script>

(3)效果

  • 初始效果

  • 输入内容

 

 

 

(4)关键代码

  • 子组件向父组件传值
1     methods: {
2       changeMsg (msg) {
3         this.$emit('getSubValue',msg);
4       }
5     }
  • 父组件定义接收的方法
1 <sunVue ref="sunVueRef" @getSubValue="getSubValue"></sunVue>

3. 总结

  组件通信在Vue开发中非常重要,掌握之后其实感觉用起来也很简单、方便。

 

posted @ 2020-05-03 17:01  什么都不懂的Eddy  阅读(137)  评论(0编辑  收藏  举报