关于Vue组件间的传值(3)--兄弟组件之间的传值

527 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第14天,点击查看活动详情
在项目开发过程中,最常用到的便是:vue组件间的传值。以下是本人总结的vue组件间传值的几种传值方式。首先可以大致区分为父子组件之间的传值,跨组件之间的传值和兄弟组件组件的传值。该文章讲解第三部分:兄弟组件之间的传值,但这也同时可应用于跨组件之间的传值。

bus总线

关于兄弟组件传值,如果项目不是很多,且需要共享的数据不是很多的话,可以考虑使用bus总线的方法。这其实就是一个发布订阅模式,利用vue的自定义事件机制,在触发的地方通过$emit向外发布一个事件,在需要监听的页面,通过$on监听事件。

可以在utils文件夹中创建一个bus.js,并在main.js中使用import vueBus from '@/utils/bus' Vue.use(vueBus )全局引入,然后把bus挂载Vue实例的原型对象上Vue.prototype.$bus = vueBus;之后就可以用$bus进行监听和触发。也可在需要使用的文件中按需引入。接下来使用局部引入的方式做总结。

bus.js

import Vue from 'vue';
​
// 使用 Event Bus
const bus = new Vue();
​
export default bus;

在需要传递数据的组件中,使用$emit发布事件

import bus from './../utils/bus'
export default {
   methods:{
     sendData(){
        bus.$emit('name', 'vivi');
     }
   }
}

在需要接收数据的组件中,可在mounted中使用$on接收数据

import bus from './../utils/bus'
export default {
   mounted(){
      bus.$on('name',data=>{
          console.log(data);  //可接收到name为'vivi'
     })
   }
}

同时要记得在生命周期中销毁或销毁之前清除自定义事件。因为正如上文所说,这是一个订阅发布模式,采用bus作为一个事件广播,因此这种方式并不会自动销毁,所以为了避免回调函数重复执行,就需要做清除操作。

this.$bus.$off('name')

2.vuex

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。可以帮助我们管理共享状态,如果项目较大,涉及的共享数据较多,可以考虑使用vuex。这部分内容较多,以后再做详细总结,本次仅总结一个最简单的情况。

Vuex由以下几个部分构成:

  • state :是存储的单一状态,是存储的基本数据。
  • Getters:是store的计算属性,和computed计算属性一样,getter返回的值会根据它的依赖被缓存起来,且只有当它的依赖值发生改变才会被重新计算。
  • Mutations:提交更改数据,使用store.commit方法更改state存储的状态。(同步函数)
  • Actions:像一个装饰器,处理异步操作,提交mutation,而不是直接变更状态。
  • Module:是store分割的模块,每个模块拥有自己的state、getters、mutations、actions。

建立一个最简单的store.js

//store.js
const store =  new Vuex.Store({
    state: {
        num: 0
    },
    
    //通过mutations来修改state中的值
    mutations: {
        add(state) {
            state.count++
        }
    },
    
    //通过action触发mutations中add方法
    actions: {
        add({commit}) {
             commit("add"); 
        }
     
    },
    
   //通过getter中的方法来获取state中的值
    getters: {
        getNum(state) {
            return state.num
        }
    }
    })
     
 export default store

使用实例

<template>
   <div>
       <p>{{this.$store.getters.getNum}}</p>
     <button @click="add">我想要增加num的值</button>
   </div>
</template>
     
<script>
 export default {
    methods: {
      add(){
         this.$store.dispatch("add");//触发add方法增加num的值
      }
    }
 }
</script>