当前位置:实例文章 » HTML/CSS实例» [文章]如何在Vue3中进行组件通信?与Vue2有何不同?

如何在Vue3中进行组件通信?与Vue2有何不同?

发布人:shili8 发布时间:2025-01-04 16:05 阅读次数:0

**Vue3 中的组件通信**

在 Vue2.x 中,组件之间的通信主要依赖于 `$emit` 和 `$on` 方法,以及 `props` 的传递。然而,在 Vue3 中,组件通信机制有了重大改进。

### **1. Props**

首先,我们来看一下 `props` 的传递。在 Vue2.x 中,`props` 是通过父组件向子组件传递的数据,而在 Vue3 中,这种方式仍然有效。然而,在 Vue3 中,我们可以使用 `defineProps` 和 `defineEmits` 来定义组件的 `props` 和事件。

javascript// Parent.vue<template>
 <div>
 <Child v-bind="data" />
 </div>
</template>

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

export default {
 components: { Child },
 data() {
 return {
 data: {
 name: 'John',
 age:30,
 },
 };
 },
};
</script>


javascript// Child.vue<template>
 <div>
 {{ name }} ({{ age }})
 </div>
</template>

<script>
export default {
 props: defineProps(['name', 'age']),
};
</script>


### **2. Emit**

在 Vue3 中,组件之间的通信也可以通过 `emit` 来实现。我们可以使用 `$emit` 方法来触发事件,而接收方则需要使用 `on` 或 `defineEmits` 来监听该事件。

javascript// Parent.vue<template>
 <div>
 <Child @update-data="handleUpdate" />
 </div>
</template>

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

export default {
 components: { Child },
 methods: {
 handleUpdate(data) {
 console.log('Received data:', data);
 },
 },
};
</script>


javascript// Child.vue<template>
 <div>
 <button @click="emitData">Emit Data</button>
 </div>
</template>

<script>
export default {
 emits: ['update-data'],
 methods: {
 emitData() {
 this.$emit('update-data', { name: 'Jane', age:25 });
 },
 },
};
</script>


### **3. Provide 和 Inject**

在 Vue2.x 中,`provide` 和 `inject` 是通过 `$root` 来实现的,而在 Vue3 中,这种方式仍然有效。我们可以使用 `provide` 方法来向祖先组件传递数据,而接收方则需要使用 `inject` 来注入该数据。

javascript// GrandParent.vue<template>
 <div>
 <Child />
 </div>
</template>

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

export default {
 components: { Child },
 provide() {
 return {
 data: 'Grand Parent Data',
 };
 },
};
</script>


javascript// Parent.vue<template>
 <div>
 <Child />
 </div>
</template>

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

export default {
 components: { Child },
 inject: ['data'],
};
</script>


### **4. Ref**

在 Vue3 中,我们可以使用 `ref` 来创建一个响应式引用。我们可以使用 `$ref` 方法来获取该引用,而接收方则需要使用 `$ref` 来注入该引用。

javascript// Parent.vue<template>
 <div>
 <Child ref="child" />
 </div>
</template>

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

export default {
 components: { Child },
};
</script>


javascript// Child.vue<template>
 <div>
 {{ data }}
 </div>
</template>

<script>
export default {
 mounted() {
 this.$parent.$refs.child.data = 'Child Data';
 },
};
</script>


### **5. Computed**

在 Vue3 中,我们可以使用 `computed` 来创建一个计算属性。我们可以使用 `$computed` 方法来获取该属性,而接收方则需要使用 `$computed` 来注入该属性。

javascript// Parent.vue<template>
 <div>
 <Child />
 </div>
</template>

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

export default {
 components: { Child },
 computed: {
 data() {
 return 'Parent Data';
 },
 },
};
</script>


javascript// Child.vue<template>
 <div>
 {{ data }}
 </div>
</template>

<script>
export default {
 mounted() {
 this.$parent.$computed.data = 'Child Data';
 },
};
</script>


### **6. Watch**

在 Vue3 中,我们可以使用 `watch` 来创建一个观察者。我们可以使用 `$watch` 方法来获取该观察者,而接收方则需要使用 `$watch` 来注入该观察者。

javascript// Parent.vue<template>
 <div>
 <Child />
 </div>
</template>

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

export default {
 components: { Child },
 watch: {
 data() {
 return 'Parent Data';
 },
 },
};
</script>


javascript// Child.vue<template>
 <div>
 {{ data }}
 </div>
</template>

<script>
export default {
 mounted() {
 this.$parent.$watch.data = 'Child Data';
 },
};
</script>


### **7. Vuex**

在 Vue3 中,我们可以使用 Vuex 来实现状态管理。我们可以使用 `$store` 方法来获取该状态,而接收方则需要使用 `$store` 来注入该状态。

javascript// store.jsimport { createStore } from 'vuex';

export default createStore({
 state: {
 data: '',
 },
});


javascript// Parent.vue<template>
 <div>
 <Child />
 </div>
</template>

<script>
import Child from './Child.vue';
import store from './store.js';

export default {
 components: { Child },
 computed: {
 data() {
 return store.state.data;
 },
 },
};
</script>


javascript// Child.vue<template>
 <div>
 {{ data }}
 </div>
</template>

<script>
import store from './store.js';

export default {
 mounted() {
 store.commit('updateData', 'Child Data');
 },
};
</script>


### **8. Pinia**

在 Vue3 中,我们可以使用 Pinia 来实现状态管理。我们可以使用 `$pinia` 方法来获取该状态,而接收方则需要使用 `$pinia` 来注入该状态。

javascript// store.jsimport { createPinia } from 'pinia';

export default createPinia({
 state: {
 data: '',
 },
});


javascript// Parent.vue<template>
 <div>
 <Child />
 </div>
</template>

<script>
import Child from './Child.vue';
import pinia from './store.js';

export default {
 components: { Child },
 computed: {
 data() {
 return pinia.state.data;
 },
 },
};
</script>


javascript// Child.vue<template>
 <div>
 {{ data }}
 </div>
</template>

<script>
import pinia from './store.js';

export default {
 mounted() {
 pinia.commit('updateData', 'Child Data');
 },
};
</script>


### **9. Vue Router**

在 Vue3 中,我们可以使用 Vue Router 来实现路由管理。我们可以使用 `$router` 方法来获取该路由,而接收方则需要使用 `$router` 来注入该路由。

javascript// router.jsimport { createRouter } from 'vue-router';

export default createRouter({
 routes: [
 {
 path: '/',
 component: () => import('./views/Home.vue'),
 },
 ],
});


javascript// Parent.vue<template>
 <div>
 <Child />
 </div>
</template>

<script>
import Child from './Child.vue';
import router from './router.js';

export default {
 components: { Child },
 computed: {
 data() {
 return router.currentRoute.value;
 },
 },
};
</script>


javascript// Child.vue<template>
 <div>
 {{ data }}
 </div>
</template>

<script>
import router from './router.js';

export default {
 mounted() {
 router.push({ name: 'Child' });
 },
};
</script>


### **10. Composition API**

在 Vue3 中,我们可以使用 Composition API 来实现组件通信。我们可以使用 `$composition` 方法来获取该组件,而接收方则需要使用 `$composition` 来注入该组件。

javascript// Parent.vue<template>
 <div>
 <Child />
 </div>
</template>

<script>
import Child from './Child.vue';
import { useComposition } from './composition.js';

export default {
 components: { Child },
 setup() {
 const composition = useComposition

其他信息

其他资源

Top