vue组件通信方式:
1、父传子: props
2、子传父: $emit
3、非父子之间的通信,中央事件总线bus
使用中央时间总线的方式有两种:
一、新建一个bus.js文件,初始化一个空的Vue实例,作为中央总线,然后再组件引用时调用这个bus.js文件
import Vue from ‘vue‘; const EventBus = new Vue(); export default EventBus;
二、是main.js全局定义,将bus挂载到vue.prototype上
import Vue from ‘vue‘; Vue.prototype.bus = new Vue();
中央事件总线使用方法:
子组件1
<template> <section> <h1>left</h1> <el-button type="primary" @click="isClick">点击</el-button> </section> </template> <script> import eventBus from ‘~/utils/eventBus‘; export default { methods: { isClick() { eventBus.$emit(‘isLeft‘, ‘点击事件!‘); this.bus.$emit(‘liRight‘, ‘asdasdasdasd‘); } } } </script>
子组件2
<template> <section> <h1>right</h1> </section> </template> <script> import eventBus from ‘~/utils/eventBus‘; export default { data() { return { name: ‘right默认值‘ }; }, mounted() { this.bus.$on(‘liRight‘, (val) => { console.log(val); }); eventBus.$on(‘isLeft‘, (info) => { console.log(info); }); }, beforeDestroy() { this.bus.$off([‘isLeft‘, ‘liRight‘]) } } </script>
父组件
<template> <section> <el-row> <el-col :span="12"> <left/> </el-col> <el-col :span="12"> <right /> </el-col> </el-row> </section> </template> <script> import left from ‘~/components/left‘ import right from ‘~/components/right‘ export default { components: { left, right } } </script>
以上事例,我们在组件1中触发了事件,然后组件2中监听到事件,并进行相关操作,两个组件是非父子组件通信
原文:https://www.cnblogs.com/tangjianqiang/p/14451899.html