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开发中非常重要,掌握之后其实感觉用起来也很简单、方便。