1.如何实现vue组件通信
vue组件通信的三种情况
父子通信
兄嘚通信
爷孙通信
父子通信:
方法一: props/$emit
父组件使用prop向子组件传递数据,子组件通过事件香父组件发送消息(v-on绑定事件)
接下来我们通过一个例子,说明父组件如何向子组件传递值,在子组件list.vue中如何获取父组件的数据list:['Visiliki','X','Emily']
父组件:
1 <template>
2 <div id="app">
3 <users v-bind:list="list"></users>
4 <!--前者自定义名称便于子组件调用,后者要传递数据名 -->
5 </div>
6 </template>
7 <script>
8 import List from './components/List'
9 export default {
10 name: 'App',
11 data() {
12 return
13 {
14 list: ['Visiliki', 'X', 'Emily']
15 }
16 },
17 components: {
18 list: List
19 }
20 }
1 <template>
2 <div class="hello">
3 <ul>
4 <li v-for="user in list">{{user}}</li>
5 <!-- 遍历传递过来的值,然后呈现到页面 -->
6 </ul>
7 </div>
8 </template>
9 <script>
10 export default {
11 name: 'HelloWorld',
12 props: {
13 list: {
14 //这个就是父组件中子标签自定义名字
15 type: Array,
16 required: true
17 }
18 }
19 }
20 </script>
子组件向父组件传值(通过事件形式)
接下来我们通过一个例子,说明子组件如何向父组件传递值:
当我们点击“Vue.js Demo”后,子组件向父组件传递值,文字由原来的“传递的是一个值”变成“子组件向父组件传值”。
实现子组件向父组件值的传递
子组件:
1 <template> 2 <header> 3 <h1 @click="changeTitle">{{title}}</h1> 4 <!-- 绑定一个事件 --> 5 </header> 6 </template> 7 <script> 8 export default { 9 name: 'app-Header', 10 data() { 11 return { 12 title:"Vue.js Demo" 13 } 14 }, 15 methods: { 16 changeTitle () { //自定义事件,传递值 17 this.$emit("titleChanged","子向父组件传值") 18 } 19 } 20 } 21 </script>
父组件:
1 <template> 2 <div id="home"> 3 <app-header v-on:titleChanged="updateTitle"></app-header> 4 <!--与子组件titleChanged自定义事件保持一致 updateTilte($event)接受传递过来的文字--> 5 <h2>{{title}}</h2> 6 </div> 7 </template> 8 <script> 9 import Header from './components/header' 10 export default { 11 name: 'home', 12 data() { 13 return { 14 title:"传递的是一个值" 15 } 16 }, 17 methods: { 18 updateTitle (e) { //声明这个函数 19 this.title = e 20 } 21 }, 22 component: { 23 'app-Header': Header 24 } 25 } 26 </script>
方法二: $emit/$oon
这种方法通过一个空的Vue实例作为中央事件总线(事件中心),用它来触发事件和监听事件。
巧妙而轻量的实现了任何组件间的通信,包括父子,兄嘚,跨级。
当我们的项目比较大时,可以选择更好的状态管理解决方案Vuex
具体实现方式:
1 var Event = new Vue(); 2 Event.$emit(事件名,数据); 3 Event.$on(事件名,data => {})
举个例子:
假设兄嘚组件有三个,分别是ABC组件,C组件如何获取A或者B组件的数据
1 <div id="itany"> 2 <my-a></my-a> 3 <my-b></my-b> 4 <my-c></my-c> 5 </div> 6 <template id="a"> 7 <div> 8 <h3>A组件: {{name}}</h3> 9 <button @click="send">将数据发送给C组件</button> 10 </div> 11 </template> 12 <template id="b"> 13 <div> 14 <h3>B组件: {{age}}</h3> 15 <button @click="send">将数据发送给C组件</button> 16 </div> 17 </template> 18 <template id="c"> 19 <div> 20 <h3>C组件: {{name}},{{age}}</h3> 21 </div> 22 </template> 23 <script> 24 var Event = new Vue(); //定义一个空的Vue实例 25 var A = { 26 template:'#a', 27 data() { 28 return { 29 name: 'Xcymo' 30 } 31 }, 32 methods: { 33 send () { 34 Event.$emit('data-a',this.name) 35 } 36 }, 37 } 38 var B = { 39 template: "#b", 40 data() { 41 return { 42 age: 20 43 } 44 }, 45 methods: { 46 send () { 47 Event.$emit('data-b',this.age) 48 } 49 }, 50 } 51 var C = { 52 template: "#c", 53 data() { 54 return { 55 name: '', 56 age: '' 57 } 58 }, 59 mounted() { 60 Event.$on('data-a',name => { 61 this.name = name; //箭头函数内部不会产生新的this,这边如果不用=>,this指代的Event 62 }) 63 Event.$on('data-b',age => { 64 this.age = age 65 }) 66 } 67 } 68 var vm = new Vue({ 69 el: '#itany', 70 components:{ 71 'my-a': A, 72 'my-b': B, 73 'my-c': C 74 } 75 }) 76 </script>
$ON监听了自定义事件data-a和data-b,因为有时会不确定何时会触发事件,一般在mounted或者created钩子中监听。
方法三 Vuex
简要介绍vuex原理
Vuex实现了一个单向数据流,在全局拥有一个State存放数据,当组件要更改State中的数据时,必须通过Mutation进行。
Mutation同时提供了订阅者模式供外部插件调用获取State数据的更新。而当所有异步操作(常见于调用接口异步获取更新数据)或者批量的同步操作需要走Action,但是Action也是无法直接修改State的,还是需要通过Mutation来修改State的数据。最后,根据State的变化,渲染到视图上。