父组件通过 props
向子组件传递数据,子组件通过 props
接收数据。
{{ message }}
子组件通过 $emit
触发事件,父组件监听事件并接收数据。
Props 和 Event Emitting
优点
props
和事件,可以明确地看到数据的来源和去向。缺点
props
和事件,导致代码冗长和复杂。通过一个中央事件总线(Event Bus)在兄弟组件之间传递数据。
// EventBus.js import Vue from 'vue'; export const EventBus = new Vue();
在需要发送事件的组件中,通过 Event Bus 触发事件:
在需要接收事件的组件中,通过 Event Bus 监听事件:
{{ message }}
Event Bus
优点
缺点
父组件通过 provide
提供数据,任意深度的子组件通过 inject
接收数据。
{{ message }}
Provide/Inject
优点
props
,简化了数据在多层组件之间的传递。provide
和 inject
进行数据共享,不需要直接引用对方,降低了组件间的耦合度。缺点
props
和事件那样显式,可能会使代码的可读性和可维护性降低。inject
只能获取由 provide
提供的数据,不能直接修改提供的数据。如果需要修改数据,需要通过事件通知祖先组件进行更新。provide
和 inject
提供的数据虽然是响应式的,但如果祖先组件的数据是通过对象解构或其他方式传递,可能会失去响应式特性。Vuex 是一个专为 Vue.js 应用开发的状态管理模式,适用于复杂的应用场景。
// store.js import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); export default new Vuex.Store({ state: { message: 'Hello from Vuex', }, mutations: { setMessage(state, newMessage) { state.message = newMessage; }, }, });
{{ message }}
Vuex 状态管理
优点
缺点
$attrs
和 $listeners
是 Vue.js 提供的两个实例属性,用于父组件和子组件之间传递属性和事件。它们可以简化中间组件的代码,将属性和事件传递给深层次的子组件。
$attrs
是一个包含了父组件传递给当前组件的所有属性(props
除外)的对象。使用 $attrs
可以将这些属性传递给子组件,特别是在中间组件不关心这些属性的情况下。
{{ message }}
在这个示例中,GrandparentComponent
向 ParentComponent
传递了一个属性 message
和一个 class 属性。ParentComponent
通过 v-bind="$attrs"
将这些属性传递给 ChildComponent
。ChildComponent
接收到 message
属性,并将其展示出来。
$listeners
是一个包含了父组件传递给当前组件的所有事件监听器的对象。使用 $listeners
可以将这些事件监听器传递给子组件,特别是在中间组件不关心这些事件的情况下。
在这个示例中,GrandparentComponent
向 ParentComponent
传递了一个事件监听器 @custom-event
。ParentComponent
通过 v-on="$listeners"
将这个事件监听器传递给 ChildComponent
。ChildComponent
触发 custom-event
事件,最终由 GrandparentComponent
处理。
$attrs 和 $listeners
优点
$attrs
和 $listeners
,可以将属性和事件传递给深层次的子组件,减少中间组件的代码量。缺点
适用于在父组件中直接访问子组件实例或 DOM 元素。
ref 和 $refs
优点
缺点
ref
会使父组件和子组件紧密耦合,增加了组件之间的依赖性,不利于组件的复用和测试。Scoped Slots 是 Vue.js 提供的一种强大的插槽机制,允许父组件向子组件传递数据或回调函数,并在子组件的插槽中使用这些数据或函数。
{{ slotProps.message }}
优点:
缺点:
Vue Router 的导航守卫可以在路由切换时进行组件间通信,特别是处理全局状态或数据加载。
// router.js const router = new VueRouter({ routes: [ { path: '/some-path', component: SomeComponent, beforeEnter: (to, from, next) => { // 在导航时进行通信或状态更新 console.log('Entering route'); next(); } } ] });
优点:
缺点:
Mixins 是一种复用代码的机制,可以将可复用的逻辑注入到多个组件中,从而实现组件间的间接通信。
// myMixin.js export const myMixin = { data() { return { mixinData: 'Hello from Mixin' }; }, methods: { mixinMethod() { console.log('Mixin method called'); } } };
{{ mixinData }}
优点:
缺点:
Vue Composition API 是 Vue 3 引入的一种新的逻辑复用机制,可以通过组合函数的方式将逻辑复用到多个组件中。
// useMyComposable.js import { ref } from 'vue'; export function useMyComposable() { const data = ref('Hello from Composable'); function method() { console.log('Composable method called'); } return { data, method }; }
{{ data }}
优点:
缺点:
在 Vue.js 中,组件间通信有多种方式,每种方式都有其适用的场景和优缺点。合理选择和组合这些方式,可以实现高效、清晰的组件间通信,满足不同的应用需求。常用的通信方式包括: