概述
vue中组件之间的传值传值情况主要有以下三种:
- 父组件向子组件传值
- 子组件向父组件传值
- 兄弟组件之间相互传值或者是两个没有关系的组件之间的传值
在开始介绍之前我们先建立3个vue文件,文件名分别为:Parent.vue , Child1.vue , Child2.vue。
父组件向子组件传值
这种情况是三种传值方案中最简单的, 通过在子组件中使用 props就可以实现。
子组件Child1.vue
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <template> <button > {{btnName}}</button> </template> <script> export default { name: 'Child1', props: ['btnName'] } </script> <style> button{ padding:5px 10px; margin:2px; background-color:#fff; border-radius: 5px; } </style>
|
父组件Parent.vue
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| <template> <div> <child-1 :btnName="btnName"/> </div> </template> <script> import Child1 from './Child1'
export default { name: 'Parent', components: { 'child-1': Child1 }, data () { return { btnName: ' 我是一个button' } } } </script>
|
关键点就是需要在子组件中 使用 props 关键字 来接收父组件传过来的值。
子组件向父组件传值
在子组件向父组件传值时需要使用 vue 中的 $on 和 $emit ,使用$emit 可以触发 $on 中监听的事件,现在我们来实现一个可以传入电话号码的功能
子组件Child2.vue
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <template> <button @click="clickHandle"> {{btnName}}</button> </template> <script> export default { name: 'Child1', props: ['btnName'], methods: { clickHandle () { this.$emit('count','120') } } } </script>
|
在父组件中有个 telNum字段用于显示电话号码。
首先我们需要在Parent.vue的data中定义telNum变量,默认值为’110’,然后将count加入到template中便于显示, 此时parent.vue的template的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| <template> <div> <p>传过来的电话号码是: {{telNum}}</p> <child-1 :btnName="btnName"/> </div> </template> <script> import Child1 from './Child1'
export default { name: 'Parent', components: { 'child-1': Child1 }, data () { return { btnName: ' 我是一个button', telNum: '110' } } } </script>
|
接下来我们需要在父组件中增加一个可以改变telNum值的事件,同时在 中加上监听事件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| <template> <div> <p>传过来的电话号码是: {{telNum}}</p> <child-1 :btnName="btnName" @count="changeCount"/> </div> </template> <script> import Child1 from './Child1'
export default { name: 'Parent', components: { 'child-1': Child1 }, data () { return { btnName: ' 我是一个button', telNum: '110' } }, methods:{ changeCount(value){ this.telNum = value; } } } </script>
|
现在通过点击button即可实现改变count的值
兄弟组件之间的传值
兄弟组件之间传值有两种方式:
- 将需要改变的值放到父组件中,子组件通过props来获取父组件的值(不推荐)
- 通过eventbus 来实现兄弟组件之间的传值,其原理还是通过$on和$emit来时实现的,区别是现在全局建立一个空的vue对象,然后将事件绑定到该空对象上,最后通过该空对象来触发$on监听的事件(不推荐)
- vuex