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的变化,渲染到视图上。

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 posted on 2022-05-17 16:00  violetlvy  阅读(15)  评论(0编辑  收藏  举报