非父子组件通信的方法

聚沙成塔·每天进步一点点


⭐ 专栏简介

Vue学习之旅的奇妙世界 欢迎大家来到 Vue 技能树参考资料专栏!创建这个专栏的初衷是为了帮助大家更好地应对 Vue.js 技能树的学习。每篇文章都致力于提供清晰、深入的参考资料,让你能够更轻松、更自信地理解和掌握 Vue.js 的核心概念和技术。订阅这个专栏,让我们一同踏上更深入的 Vue学习之旅!为你的前端技能树添砖加瓦!

在这里插入图片描述


在Vue中,实现非父子组件通信有多种方法,根据项目的需求和复杂性,开发者可以选择适合的方式。以下是一些常用的非父子组件通信方法:

1. 中央事件总线 (EventBus)

中央事件总线是一个空的 Vue 实例,用作组件之间的通信中心。组件通过触发和监听事件来实现通信。

发送事件的组件:

<template>
  <div>
    <button @click="sendMessage">Send Message</button>
  </div>
</template>

<script>
import { EventBus } from './EventBus.js';

export default {
  methods: {
    sendMessage() {
      EventBus.$emit('custom-event', 'Hello from sender!');
    },
  },
};
</script>

接收事件的组件:

<template>
  <div>
    <p>{{ receivedMessage }}</p>
  </div>
</template>

<script>
import { EventBus } from './EventBus.js';

export default {
  data() {
    return {
      receivedMessage: '',
    };
  },
  created() {
    EventBus.$on('custom-event', (message) => {
      this.receivedMessage = message;
    });
  },
};
</script>

2. Vuex 状态管理

Vuex 是 Vue.js 应用程序开发的状态管理模式。它集中管理应用的状态,并提供了一种可预测的方式修改状态。

配置 Vuex:

// store.js
import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

export default new Vuex.Store({
  state: {
    message: '',
  },
  mutations: {
    setMessage(state, message) {
      state.message = message;
    },
  },
});

使用 Vuex 的组件:

<template>
  <div>
    <button @click="sendMessage">Send Message</button>
    <p>{{ $store.state.message }}</p>
  </div>
</template>

<script>
export default {
  methods: {
    sendMessage() {
      this.$store.commit('setMessage', 'Hello from sender!');
    },
  },
};
</script>

3. Provide / Inject

provideinject 是 Vue 提供的一种高级选项,可以在祖先组件中使用 provide 提供数据,而在后代组件中使用 inject 来注入这些数据。

祖先组件:

<template>
  <div>
    <child-component></child-component>
  </div>
</template>

<script>
export default {
  provide() {
    return {
      message: 'Hello from provider!',
    };
  },
};
</script>

后代组件:

<template>
  <div>
    <p>{{ injectedMessage }}</p>
  </div>
</template>

<script>
export default {
  inject: ['message'],
  computed: {
    injectedMessage() {
      return this.message;
    },
  },
};
</script>

4. $attrs 和 $listeners

每个组件实例都有 $attrs$listeners 属性,可以用于在父组件中访问子组件的属性和监听事件。

<!-- 子组件 -->
<template>
  <div>
    <!-- 子组件的模板 -->
  </div>
</template>

<script>
export default {
  mounted() {
    this.$emit('custom-event', 'Hello from child!');
  },
};
</script>
<!-- 父组件 -->
<template>
  <div>
    <child-component @custom-event="handleCustomEvent"></child-component>
  </div>
</template>

<script>
export default {
  methods: {
    handleCustomEvent(message) {
      console.log(message);
    },
  },
};
</script>

5. 第三方状态管理库

除了 Vuex 外,还可以使用其他的第三方状态管理库,例如 Redux 或 MobX。这些库提供了更多高级的状态管理和通信机制,适用于大型应用。

这些是一些用于非父子组件通信的常见方法。根据项目的具体情况,可以选择最合适的方式,以实现灵活而高效的组件通信。


⭐ 写在最后

欢迎来到《Vue技能树专栏》!本专栏旨在帮助您全面深入地掌握Vue.js,一款现代、灵活且强大的JavaScript框架。无论您是初学者还是有一定经验的开发者,这里都将为您提供详细的指导、实用的技巧以及深入的理解,助您在Vue.js世界中游刃有余。如果文中出现有瑕疵的地方各位可以通过主页的左侧联系我指正,我们一起进步,

  • 17
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

几何心凉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值