Vue实现组件间通信的11种方式

简介: 前端-实践

原文合集地址如下,有需要的朋友可以关注

本文地址

合集地址

组件之间的通信是指不同组件之间在共享数据、传递消息或触发事件等方面进行交流和协作的过程。在应用程序中,不同的组件可能需要相互传递数据、共享状态、触发动作或响应事件等,以实现组件之间的协调和交互。

vue组件之间的通信可以有多种形式和方式,常见的包括:

  1. Props / 组件属性: 通过父组件向子组件传递数据,将数据作为组件的属性(props)传递给子组件。子组件通过接收这些属性来访问和使用父组件传递的数据。
<!-- 父组件 -->
<template>
  <div>
    <child-component :message="parentMessage" />
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
   
  components: {
   
    ChildComponent
  },
  data() {
   
    return {
   
      parentMessage: 'Hello from parent'
    };
  }
}
</script>

<!-- 子组件 ChildComponent.vue -->
<template>
  <div>
    <p>{
   {
    message }}</p>
  </div>
</template>

<script>
export default {
   
  props: ['message']
}
</script>
  1. Custom Events / 自定义事件: 子组件可以触发自定义事件,并通过事件传递数据给父组件或其他监听该事件的组件。父组件或其他组件通过监听并处理这些自定义事件来接收传递的数据。
<!-- 父组件 -->
<!-- 子组件 ChildComponent.vue -->
<template>
  <div>
    <button @click="sendMessage">Send Message</button>
  </div>
</template>

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

<!-- 父组件 -->
<template>
  <div>
    <child-component @custom-event="handleEvent" />
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
   
  components: {
   
    ChildComponent
  },
  methods: {
   
    handleEvent(message) {
   
      console.log(message); // 输出:Hello from child
    }
  }
}
</script>
  1. Event Bus / 事件总线: 使用一个全局事件总线来实现组件之间的通信。不同的组件可以通过事件总线来订阅和发布事件,实现数据的传递和通知。需要先下载依赖mtt
npm install mitt
// 或者
yarn add mitt
// EventBus.js
import mitt from 'mitt';

const bus = mitt();

export default bus;
<!-- 组件A -->
<template>
  <div>
    <button @click="sendMessage">Send Message</button>
  </div>
</template>

<script>
import bus from './EventBus';

export default {
   
  methods: {
   
    sendMessage() {
   
      bus.emit('custom-event', 'Hello from Component A');
    }
  }
}
</script>

<!-- 组件B -->
<template>
  <div>
    <p>{
   {
    message }}</p>
  </div>
</template>

<script>
import bus from './EventBus';

export default {
   
  data() {
   
    return {
   
      message: ''
    };
  },
  mounted() {
   
    bus.on('custom-event', (message) => {
   
      this.message = message;
    });
  }
}
</script>
  1. Vuex / 状态管理: 使用 Vuex 这样的状态管理库来集中管理应用程序的状态。不同的组件可以通过访问共享的状态来实现通信和共享数据。
// 创建 Vuex 存储
import {
    createStore } from 'vuex';

const store = createStore({
   
  state() {
   
    return {
   
      message: 'Hello from Vuex'
    };
  },
  mutations: {
   
    updateMessage(state, newMessage) {
   
      state.message = newMessage;
    }
  }
});

export default store;
<!-- 子组件 ChildComponent.vue -->
<template>
  <div>
    <p>{
   {
    message }}</p>
    <button @click="updateMessage">Update Message</button>
  </div>
</template>

<script>
import {
    useStore } from 'vuex';

export default {
   
  setup() {
   
    const store = useStore();

    const updateMessage = () => {
   
      store.commit('updateMessage', 'Updated message from child');
    };

    return {
   
      message: store.state.message,
      updateMessage
    };
  }
}
</script>

<!-- 父组件 -->
<template>
  <div>
    <child-component />
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
   
  components: {
   
    ChildComponent
  }
}
</script>
  1. Provide / Inject: 使用 provide 和 inject API 来在组件树中提供和注入数据。父组件通过 provide 提供数据,子组件通过 inject 来注入需要的数据。
<!-- 祖先组件 -->
<template>
  <div>
    <child-component />
  </div>
</template>

<script>
import {
    provide } from 'vue';

export default {
   
  setup() {
   
    const message = 'Hello from ancestor';
    provide('message', message);
  }
}
</script>

<!-- 后代组件 -->
<template>
  <div>
    <p>{
   {
    injectedMessage }}</p>
  </div>
</template>

<script>
import {
    inject } from 'vue';

export default {
   
  setup() {
   
    const injectedMessage = inject('message');
    return {
   
      injectedMessage
    };
  }
}
</script>
  1. Ref / Reactive: 使用 Vue 3 的 Composition API 中的 ref 和 reactive 来创建和响应式地共享数据,以便不同组件可以访问和修改这些数据。
<!-- 子组件 -->
<template>
  <div>
    <p>{
   {
    message }}</p>
  </div>
</template>

<script>
export default {
   
  data() {
   
    return {
   
      message: 'Hello from child'
    };
  }
}
</script>

<!-- 父组件 -->
<template>
  <div>
    <child-component ref="childRef" />
    <button @click="getChildMessage">Get Child Message</button>
  </div>
</template>

<script>
import {
    ref } from 'vue';

export default {
   
  components: {
   
    ChildComponent
  },
  setup() {
   
    const childRef = ref(null);

    const getChildMessage = () => {
   
      const message = childRef.value.message;
      console.log(message); // 输出:Hello from child
    };

    return {
   
      childRef,
      getChildMessage
    };
  }
}
</script>
  1. 全局事件 / 订阅发布模式: 使用全局事件或订阅发布模式来实现组件之间的通信。不同组件可以订阅和发布事件,以实现数据的传递和交互。
// 创建一个事件总线
const eventBus = new Vue();

// 组件A
const ComponentA = {
   
  methods: {
   
    updateMessage() {
   
      const newMessage = 'Updated message from Component A';
      eventBus.$emit('messageUpdated', newMessage);
    }
  },
  // 组件A的其他逻辑
};

// 组件B
const ComponentB = {
   
  data() {
   
    return {
   
      message: ''
    };
  },
  mounted() {
   
    eventBus.$on('messageUpdated', (newMessage) => {
   
      this.message = newMessage;
    });
  },
  // 组件B的其他逻辑
};

8.useAttrs: useAttrs是 Vue 3 中提供的一个 Composition API,用于获取组件上未声明为props的属性。

<!-- 组件 -->
<template>
  <div>
    <p>{
   {
    customAttribute }}</p>
  </div>
</template>

<script>
import {
    useAttrs } from 'vue';

export default {
   
  setup() {
   
    const attrs = useAttrs();
    return {
   
      customAttribute: attrs['custom-attribute']
    };
  }
}
</script>

<!-- 使用组件 -->
<template>
  <div>
    <custom-component custom-attribute="Custom Attribute Value" />
  </div>
</template>

<script>
import CustomComponent from './CustomComponent.vue';

export default {
   
  components: {
   
    CustomComponent
  }
}
</script>
  1. Pinia: Pinia 是一个基于 Vue 3 的状态管理库,提供了一种更简洁和类型安全的方式来管理和共享组件之间的状态。需要先下载依赖
npm install pinia
//或者
yarn add pinia
// 创建 Pinia 存储
import {
    createPinia } from 'pinia';

const pinia = createPinia();

export default pinia;
<!-- 组件A -->
<template>
  <div>
    <button @click="updateMessage">Update Message</button>
  </div>
</template>

<script>
import {
    useStore } from 'pinia';

export default {
   
  setup() {
   
    const store = useStore();

    const updateMessage = () => {
   
      store.message = 'Updated message from Component A';
    };

    return {
   
      updateMessage
    };
  }
}
</script>

<!-- 组件B -->
<template>
  <div>
    <p>{
   {
    message }}</p>
  </div>
</template>

<script>
import {
    useStore } from 'pinia';

export default {
   
  setup() {
   
    const store = useStore();

    return {
   
      message: store.message
    };
  }
}
</script>
  1. 插槽(Slots): 插槽是一种允许父组件向子组件传递内容的机制。父组件可以在子组件中定义插槽,并将内容传递给插槽,子组件可以根据需要使用这些内容。
<!-- 父组件 -->
<template>
  <div>
    <child-component>
      <!-- 插槽内容 -->
      <template v-slot:content>
        <p>{
   {
    message }}</p>
        <button @click="updateMessage">Update Message</button>
      </template>
    </child-component>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
   
  components: {
   
    ChildComponent
  },
  data() {
   
    return {
   
      message: 'Hello from parent'
    };
  },
  methods: {
   
    updateMessage() {
   
      this.message = 'Updated message from parent';
    }
  }
}
</script>
<!-- 子组件 -->
<template>
  <div>
    <!-- 插槽 -->
    <slot name="content"></slot>
  </div>
</template>

<script>
export default {
   
  // 子组件逻辑
}
</script>
  1. v-model: v-model 是一种用于在父组件和子组件之间实现双向绑定的语法糖。它将value属性和input事件绑定在一起,使得父组件可以通过v-model来直接更新子组件的数据。
<!-- 子组件 -->
<template>
  <div>
    <input :value="value" @input="$emit('update:value', $event.target.value)" />
  </div>
</template>

<script>
export default {
   
  props: ['value']
}
</script>

<!-- 父组件 -->
<template>
  <div>
    <child-component v-model="message" />
    <p>Message: {
   {
    message }}</p>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
   
  components: {
   
    ChildComponent
  },
  data() {
   
    return {
   
      message: ''
    };
  }
}
</script>

这些通信方式可以根据应用程序的需求和复杂性进行选择和组合使用,以实现组件之间的有效通信和协作。

目录
相关文章
|
8天前
|
JavaScript 前端开发 开发者
Vue中的class和style绑定
在 Vue 中,class 和 style 绑定是基于数据驱动视图的强大功能。通过 class 绑定,可以动态更新元素的 class 属性,支持对象和数组语法,适用于普通元素和组件。style 绑定则允许以对象或数组形式动态设置内联样式,Vue 会根据数据变化自动更新 DOM。
|
8天前
|
移动开发 JavaScript API
Vue Router 核心原理
Vue Router 是 Vue.js 的官方路由管理器,用于实现单页面应用(SPA)的路由功能。其核心原理包括路由配置、监听浏览器事件和组件渲染等。通过定义路径与组件的映射关系,Vue Router 将用户访问的路径与对应的组件关联,支持哈希和历史模式监听 URL 变化,确保页面导航时正确渲染组件。
|
8天前
|
JavaScript 前端开发 数据安全/隐私保护
Vue Router 简介
Vue Router 是 Vue.js 官方的路由管理库,用于构建单页面应用(SPA)。它将不同页面映射到对应组件,支持嵌套路由、路由参数和导航守卫等功能,简化复杂前端应用的开发。主要特性包括路由映射、嵌套路由、路由参数、导航守卫和路由懒加载,提升性能和开发效率。安装命令:`npm install vue-router`。
|
12天前
|
监控 JavaScript 前端开发
ry-vue-flowable-xg:震撼来袭!这款基于 Vue 和 Flowable 的企业级工程项目管理项目,你绝不能错过
基于 Vue 和 Flowable 的企业级工程项目管理平台,免费开源且高度定制化。它覆盖投标管理、进度控制、财务核算等全流程需求,提供流程设计、部署、监控和任务管理等功能,适用于企业办公、生产制造、金融服务等多个场景,助力企业提升效率与竞争力。
66 12
|
29天前
|
JavaScript 安全 API
iframe嵌入页面实现免登录思路(以vue为例)
通过上述步骤,可以在Vue.js项目中通过 `iframe`实现不同应用间的免登录功能。利用Token传递和消息传递机制,可以确保安全、高效地在主应用和子应用间共享登录状态。这种方法在实际项目中具有广泛的应用前景,能够显著提升用户体验。
60 8
|
30天前
|
存储 设计模式 JavaScript
Vue 组件化开发:构建高质量应用的核心
本文深入探讨了 Vue.js 组件化开发的核心概念与最佳实践。
77 1
|
2月前
|
JavaScript
vue使用iconfont图标
vue使用iconfont图标
151 1
|
2月前
|
JavaScript 关系型数据库 MySQL
基于VUE的校园二手交易平台系统设计与实现毕业设计论文模板
基于Vue的校园二手交易平台是一款专为校园用户设计的在线交易系统,提供简洁高效、安全可靠的二手商品买卖环境。平台利用Vue框架的响应式数据绑定和组件化特性,实现用户友好的界面,方便商品浏览、发布与管理。该系统采用Node.js、MySQL及B/S架构,确保稳定性和多功能模块设计,涵盖管理员和用户功能模块,促进物品循环使用,降低开销,提升环保意识,助力绿色校园文化建设。
|
3月前
|
JavaScript API 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的
|
3月前
|
JavaScript 前端开发 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的

热门文章

最新文章