Vuex及Vue组件通信

Vuex及Vue组件通信

Vuex是一个专为 Vue.js 应用程序开发的状态管理模式 + 库。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证
状态以一种可预测的方式发生变化。
通俗点说就是不用考虑组件之间的嵌套关系(例如:父子、祖孙、兄弟等),就可以让组件之间进行互相通信。

组件五把数据存储到Vuex共享状态中,组件六使用数据的话就可以再从Vuex共享状态中进行获取,从而完成组件之间的通信。这
种通信方式不需要考虑组件之间的嵌套关系,所以通信起来会更加的灵活。

Vue 组件通信

1. 父子通信:props 与 emits

在父子组件之间进行通信是最常见的场景。父组件通过 props 将数据传递给子组件,子组件通过 emits 事件将数据发送给父组件。

示例:

// Parent.vue
<template>
<div>
<Child :message="message" @update-message="updateMessage" />
</div>
</template>
<script>
import Child from './Child.vue';
export default {
data() {
return {
message: 'Hello from parent',
};
},
methods: {
updateMessage(newMessage) {
this.message = newMessage;
},
},
components: {
Child,
},
};
</script>
// Child.vue
<template>
<div>
<p>{{ message }}</p>
<button @click="sendMessage">Send Message</button>
</div>
</template>
<script>
export default {
props: ['message'],
methods: {
sendMessage() {
this.$emit('update-message', 'Hello from child');
},
},
};
</script>

在上面的示例中,父组件通过 :message="message"message 属性传递给子组件,子组件通过 $emit 方法触发 update-message 事件,并将新的消息作为参数传递给父组件的 updateMessage 方法。

2. 跨组件通信:provide 与 inject

在跨组件层级的通信场景中,可以使用 provide 和 inject 来实现。父组件通过 provide 提供数据,子组件通过 inject 注入数据。

示例:

// Parent.vue
<template>
<div>
<Child />
</div>
</template>
<script>
import Child from './Child.vue';
export default {
provide: {
message: 'Hello from parent',
},
components: {
Child,
},
};
</script>
// Child.vue
<template>
<div>
<p>{{ message }}</p>
</div>
</template>
<script>
export default {
inject: ['message'],
};
</script>

在上面的示例中,父组件通过 provide 选项提供了一个名为 message 的数据,子组件通过 inject 选项注入了这个数据,并可以在模板中直接使用。

3. $attrs

$attrs 是一个特殊的属性,用于在组件之间传递父组件中未被子组件 prop 所接收的属性。

示例:

// Parent.vue
<template>
<div>
<Child v-bind="$attrs" />
</div>
</template>
<script>
import Child from './Child.vue';
export default {
components: {
Child,
},
};
</script>
// Child.vue
<template>
<div>
<p>{{ $attrs.message }}</p>
</div>
</template>

在上面的示例中,父组件通过 v-bind="$attrs" 将所有未被子组件接收的属性传递给子组件,子组件可以通过 $attrs 访问这些属性。

4. $refs

$refs 是一个特殊的属性,用于在父组件中访问子组件的实例或 DOM 元素。

示例:

// Parent.vue
<template>
<div>
<Child ref="childRef" />
<button @click="sendMessage">Send Message</button>
</div>
</template>
<script>
import Child from './Child.vue';
export default {
methods: {
sendMessage() {
this.$refs.childRef.receiveMessage('Hello from parent');
},
},
components: {
Child,
},
};
</script>
// Child.vue
<template>
<div>
<p>{{ message }}</p>
</div>
</template>
<script>
export default {
data() {
return {
message: '',
};
},
methods: {
receiveMessage(message) {
this.message = message;
},
},
};
</script>

在上面的示例中,父组件通过 ref 属性给子组件指定一个引用名称,然后可以通过 this.$refs.childRef 访问子组件的实例。父组件可以直接调用子组件的方法或访问子组件的数据。

5. Vuex 状态管理

Vuex 是 Vue.js 的官方状态管理库,用于管理应用程序的共享状态。通过 Vuex,不同组件之间可以共享和修改状态。

示例:

// store.js
import { createStore } from 'vuex';
const store = createStore({
state() {
return {
message: 'Hello from store',
};
},
mutations: {
updateMessage(state, newMessage) {
state.message = newMessage;
},
},
});
export default store;
// Parent.vue
<template>
<div>
<p>{{ message }}</p>
<button @click="updateMessage">Update Message</button>
</div>
</template>
<script>
export default {
computed: {
message() {
return this.$store.state.message;
},
},
methods: {
updateMessage() {
this.$store.commit('updateMessage', 'New message from parent');
},
},
};
</script>

在上面的示例中,我们创建了一个 Vuex 的 store,其中包含一个名为 message 的状态和一个名为 updateMessage 的 mutation。在父组件中,通过 this.$store.state.message 访问状态,并通过 this.$store.commit 调用 mutation 来修改状态。

以上是一些常见的 Vue 组件通信方案。根据具体的场景和需求,选择适合的方案来实现组件之间的通信。

posted @   Laravel自学开发  阅读(120)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
点击右上角即可分享
微信分享提示