Vue_(组件通讯)非父子关系组件通信

 

 

  Vue单项数据流  传送门

  Vue中不同的组件,即使不存在父子关系也可以相互通信,我们称为非父子关系通信

  我们需要借助一个空Vue实例,在不同的组件中,使用相同的Vue实例来发送/监听事件,达到数据通信的目的

  

  

  Learn

     一、单项数据流

 

  目录结构

  

  【每个demo下方都存有html源码】

 

一、单项数据流

  定义组件A和组件B,组件A和组件B同级关系,当点击<template-a>的button控件时,调用sendData函数,将template-a中的data数据发向template-b

    <template id="template-a">
        <div>
            <h1>my-component-a</h1>
            comA name : <span>{{name}}</span><br />
            <button @click="sendData">发送数据给comB</button>
            <hr />
        </div>
    </template>
    
    <template id="template-b">
        <div>
            <h2>my-component-b</h2>
            comB name : <span>{{nameB}}</span>
            <hr />
        </div>
    </template>

 

  coma绑定template-a模块组件,comb绑定template-b模块组件,要进行数据中转时候,一定要注意template-b模块组件中的this关键字

let comA = {
            template :  "#template-a",
            data(){
                return {
                    name : "AdataGary"
                }
            },
            methods : {
                sendData(){
                    vm.$emit('send-event-a', this.name);
                }
            }
        }
        
        let comB = {
            template :  "#template-b",
            data(){
                return {
                    nameB : ''
                }
            },
            mounted(){
                /*vm.$on('send-event-a', function(value){
                    console.log(this);
                    this.nameB = value;
                });*/
                vm.$on('send-event-a', name => {
                    console.log(this);
                    this.nameB = name;
                })
            }
        }

 

  在Vue中注册申请

        let vm = new Vue({
            data : {
                msg : 'Garydat'
            }
        });
        new Vue({
            data : {
                
            },
            components : {
                "my-component-a" : comA,
                "my-component-b" : comB
            }
        }).$mount("#GaryId");

 

 

 

 

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Gary</title>
    </head>
    <body>
        <div id="GaryId">
            <my-component-a></my-component-a>
            <my-component-b></my-component-b>
        </div>
    </body>

    <template id="template-a">
        <div>
            <h1>my-component-a</h1>
            comA name : <span>{{name}}</span><br />
            <button @click="sendData">发送数据给comB</button>
            <hr />
        </div>
    </template>
    
    <template id="template-b">
        <div>
            <h2>my-component-b</h2>
            comB name : <span>{{nameB}}</span>
            <hr />
        </div>
    </template>

    <script type="text/javascript" src="../js/vue.js" ></script>
    <script type="text/javascript">
    
        let comA = {
            template :  "#template-a",
            data(){
                return {
                    name : "AdataGary"
                }
            },
            methods : {
                sendData(){
                    vm.$emit('send-event-a', this.name);
                }
            }
        }
        
        let comB = {
            template :  "#template-b",
            data(){
                return {
                    nameB : ''
                }
            },
            mounted(){
                /*vm.$on('send-event-a', function(value){
                    console.log(this);
                    this.nameB = value;
                });*/
                vm.$on('send-event-a', name => {
                    console.log(this);
                    this.nameB = name;
                })
            }
        }
    
        let vm = new Vue({
            data : {
                msg : 'Garydat'
            }
        });
        new Vue({
            data : {
                
            },
            components : {
                "my-component-a" : comA,
                "my-component-b" : comB
            }
        }).$mount("#GaryId");
    
    </script>
</html>
Gary_non-fatherAndSon.html

 

转载于:https://www.cnblogs.com/1138720556Gary/p/10549831.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 中,如果要在一个组件中操作另一个父子关系组件中的事件,可以使用事件总线或 Vuex 状态管理。以下是两种方法的介绍: 1. 使用事件总线 事件总线是一个中央事件管理器,可以让不同组件之间进行通信。在 Vue 中,可以使用一个空的 Vue 实例作为事件总线。 首先,在一个单独的 js 文件中创建一个事件总线: ``` // eventBus.js import Vue from 'vue' export const eventBus = new Vue() ``` 然后,在组件 A 中触发一个事件: ``` // ComponentA.vue import { eventBus } from './eventBus.js' export default { methods: { handleClick() { eventBus.$emit('myEvent', data) } } } ``` 最后,在组件 B 中监听并处理该事件: ``` // ComponentB.vue import { eventBus } from './eventBus.js' export default { mounted() { eventBus.$on('myEvent', this.handleMyEvent) }, methods: { handleMyEvent(data) { // 处理事件 } } } ``` 2. 使用 Vuex Vuex 是 Vue 的状态管理器,可以让不同组件之间共享状态。在 Vuex 中,组件可以通过提交 mutation 或触发 action 来修改状态。 首先,在 Vuex 中定义一个 state 和一个 mutation: ``` // store.js import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) const store = new Vuex.Store({ state: { myData: null }, mutations: { setMyData(state, data) { state.myData = data } } }) export default store ``` 然后,在组件 A 中触发一个 mutation: ``` // ComponentA.vue import store from './store.js' export default { methods: { handleClick() { store.commit('setMyData', data) } } } ``` 最后,在组件 B 中读取该状态: ``` // ComponentB.vue import { mapState } from 'vuex' export default { computed: { ...mapState({ myData: state => state.myData }) }, watch: { myData(newVal) { // 处理状态变化 } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值