经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » Vue.js » 查看文章
深入理解 Vue 3 组件通信
来源:cnblogs  作者:最小生成树  时间:2024/7/19 10:38:33  对本文有异议

在 Vue 3 中,组件通信是一个关键的概念,它允许我们在组件之间传递数据和事件。本文将介绍几种常见的 Vue 3 组件通信方法,包括 propsemitsprovideinject、事件总线以及 Vuex 状态管理。

1. 使用 propsemits 进行父子组件通信

props 传递数据

props 是父组件向子组件传递数据的一种机制。在子组件中,通过定义 props 属性来接收父组件传递的数据。

父组件 (ParentComponent.vue):

  1. <template>
  2. <ChildComponent :message="parentMessage" />
  3. </template>
  4.  
  5. <script>
  6. import ChildComponent from './ChildComponent.vue';
  7. export default {
  8. components: {
  9. ChildComponent
  10. },
  11. data() {
  12. return {
  13. parentMessage: 'Hello from Parent Component!'
  14. };
  15. }
  16. };
  17. </script>

 

子组件 (ChildComponent.vue):

  1. <template>
  2. <div>{{ message }}</div>
  3. </template>
  4.  
  5. <script>
  6. export default {
  7. props: {
  8. message: {
  9. type: String,
  10. required: true
  11. }
  12. }
  13. };
  14. </script>

 

emits 传递事件

子组件可以通过 $emit 方法向父组件发送事件,从而实现从子组件向父组件传递信息。

子组件 (ChildComponent.vue):

  1. <template>
  2. <button @click="sendMessage">Send Message</button>
  3. </template>
  4.  
  5. <script>
  6. export default {
  7. emits: ['messageSent'],
  8. methods: {
  9. sendMessage() {
  10. this.$emit('messageSent', 'Hello from Child Component!');
  11. }
  12. }
  13. };
  14. </script>

 

父组件 (ParentComponent.vue):

  1. <template>
  2. <ChildComponent @messageSent="handleMessage" />
  3. </template>
  4.  
  5. <script>
  6. import ChildComponent from './ChildComponent.vue';
  7. export default {
  8. components: {
  9. ChildComponent
  10. },
  11. methods: {
  12. handleMessage(message) {
  13. console.log(message);
  14. }
  15. }
  16. };
  17. </script>

 

2. 使用 provideinject 进行祖孙组件通信

provideinject 允许祖父组件和孙组件之间进行通信,而不需要通过中间的父组件传递数据。

祖父组件 (GrandparentComponent.vue):

  1. <template>
  2. <ParentComponent />
  3. </template>
  4.  
  5. <script>
  6. import ParentComponent from './ParentComponent.vue';
  7. export default {
  8. components: {
  9. ParentComponent
  10. },
  11. provide() {
  12. return {
  13. grandparentMessage: 'Hello from Grandparent Component!'
  14. };
  15. }
  16. };
  17. </script>

 

孙组件 (GrandchildComponent.vue):

  1. <template>
  2. <div>{{ grandparentMessage }}</div>
  3. </template>
  4.  
  5. <script>
  6. export default {
  7. inject: ['grandparentMessage']
  8. };
  9. </script>

 

3. 使用事件总线进行兄弟组件通信

事件总线是一种常见的用于兄弟组件通信的方法,通常使用 Vue 实例作为事件总线。

事件总线 (eventBus.js):

  1. import { reactive } from 'vue';
  2. const eventBus = reactive({});
  3. export default eventBus;

 

组件 A (ComponentA.vue):

  1. <template>
  2. <button @click="sendMessage">Send Message to Component B</button>
  3. </template>
  4.  
  5. <script>
  6. import eventBus from './eventBus.js';
  7. export default {
  8. methods: {
  9. sendMessage() {
  10. eventBus.message = 'Hello from Component A!';
  11. }
  12. }
  13. };
  14. </script>

 

组件 B (ComponentB.vue):

  1. <template>
  2. <div>{{ message }}</div>
  3. </template>
  4.  
  5. <script>
  6. import { reactive, toRefs } from 'vue';
  7. import eventBus from './eventBus.js';
  8. export default {
  9. setup() {
  10. const state = reactive({
  11. message: ''
  12. });
  13. state.message = eventBus.message;
  14. return {
  15. ...toRefs(state)
  16. };
  17. }
  18. };
  19. </script>

 

 

 

原文链接:https://www.cnblogs.com/zx618/p/18310362

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号