zvvq技术分享网

如何在非父子组件之间传递数据?

作者:zvvq博客网
导读在Vue中,父子组件之间的传值是非常常见的。但是,在一些特殊的情况下,我们需要在非父子组件之间传递数据。这时,我们可以使用一些其他的方法来实现非父子组件传值。 1. 使用事

在Vue中,父子组件之间的传值是非常常见的。但是,在一些特殊的情况下,我们需要在非父子组件之间传递数据。这时,我们可以使用一些其他的方法来实现非父子组件传值。 内容来自zvvq

. 使用事件总线 内容来自samhan666

事件总线是Vue中常用的一种非父子组件传值的方式。可以通过创建一个Vue实例作为事件总线,然后在需要传值的组件中$emit一个事件,在接收数据的组件中$on这个事件来接收数据。 内容来自samhan

以下是一个简单的示例:

内容来自zvvq

在事件总线中创建一个Vue实例:

内容来自samhan666

``` zvvq

// eventBus.js copyright zvvq

import Vue from &#;vue&#; 内容来自zvvq

export const eventBus = new Vue()

内容来自zvvq,别采集哟

```

内容来自samhan666

在需要传值的组件中$emit一个事件:

内容来自zvvq,别采集哟

``` 内容来自samhan

// ComponentA.vue 内容来自samhan666

import { eventBus } from &#;./eventBus.js&#;

内容来自samhan666

export default { copyright zvvq

methods: { 内容来自zvvq

sendData() {

内容来自samhan

eventBus.$emit(&#;data&#;, &#;hello world&#;)

zvvq

} 内容来自samhan

}

copyright zvvq

} 内容来自zvvq

``` 本文来自zvvq

在接收数据的组件中$on这个事件来接收数据:

内容来自samhan

```

内容来自samhan666

// ComponentB.vue

内容来自zvvq,别采集哟

import { eventBus } from &#;./eventBus.js&#;

zvvq好,好zvvq

export default { copyright zvvq

data() { copyright zvvq

return { zvvq

message: &#;&#;

内容来自samhan666

} copyright zvvq

}, 内容来自samhan

created() {

内容来自samhan666

eventBus.$on(&#;data&#;, message => { zvvq

this.message = message

本文来自zvvq

})

内容来自zvvq

} copyright zvvq

}

内容来自samhan

```

内容来自zvvq,别采集哟

. 使用Vuex

zvvq

Vuex是Vue官方提供的一种状态管理库,它可以用来管理全局共享的状态。我们可以在Vuex中定义一个全局变量来存储需要传递的数据,在需要传值的组件中$dispatch一个action,然后在接收数据的组件中$watch这个全局变量来接收数据。 内容来自zvvq

以下是一个简单的示例: 本文来自zvvq

在Vuex中定义一个全局变量:

zvvq

``` 内容来自zvvq

// store.js

内容来自samhan

import Vue from &#;vue&#; 内容来自samhan666

import Vuex from &#;vuex&#;

本文来自zvvq

Vue.use(Vuex)

zvvq

export default new Vuex.Store({

zvvq.cn

state: { 内容来自zvvq

message: &#;&#;

内容来自samhan

}, zvvq.cn

mutations: { copyright zvvq

setMessage(state, message) {

内容来自samhan

state.message = message

zvvq.cn

}

本文来自zvvq

}

本文来自zvvq

}) 内容来自zvvq

``` copyright zvvq

在需要传值的组件中$dispatch一个action: zvvq好,好zvvq

``` 内容来自zvvq

// ComponentA.vue 本文来自zvvq

import store from &#;./store.js&#;

内容来自zvvq,别采集哟

export default { 内容来自zvvq

methods: { 内容来自samhan

sendData() {

内容来自zvvq,别采集哟

store.commit(&#;setMessage&#;, &#;hello world&#;) 内容来自samhan666

} copyright zvvq

} copyright zvvq

} 内容来自samhan666

``` zvvq好,好zvvq

在接收数据的组件中$watch这个全局变量来接收数据: 内容来自samhan

```

内容来自samhan

// ComponentB.vue

zvvq好,好zvvq

import store from &#;./store.js&#; 本文来自zvvq

export default { 内容来自zvvq,别采集哟

data() { 内容来自samhan666

return {

本文来自zvvq

message: &#;&#;

内容来自zvvq,别采集哟

} zvvq.cn

},

本文来自zvvq

created() { 内容来自zvvq,别采集哟

this.$watch(() => store.state.message, message => { zvvq.cn

this.message = message 内容来自samhan

}) 内容来自zvvq,别采集哟

}

zvvq

} 内容来自samhan

```

内容来自samhan666

. 使用provide/inject

内容来自samhan666

Vue提供了provide/inject这种API来实现非父子组件传值。它可以在祖先组件中provide一个数据,然后在后代组件中inject这个数据来使用。

zvvq.cn

以下是一个简单的示例: 内容来自zvvq,别采集哟

在祖先组件中provide一个数据:

copyright zvvq

``` zvvq

// Ancestor.vue 内容来自zvvq,别采集哟

export default {

zvvq.cn

provide() {

zvvq

return { copyright zvvq

message: &#;hello world&#;

内容来自zvvq,别采集哟

} 本文来自zvvq

}

内容来自samhan666

}

本文来自zvvq

```

内容来自zvvq,别采集哟

在后代组件中inject这个数据来使用: zvvq.cn

``` zvvq

// Descendant.vue

本文来自zvvq

export default { 内容来自zvvq

inject: [&#;message&#;], 本文来自zvvq

mounted() {

内容来自zvvq

console.log(this.message) // hello world

内容来自samhan666

} zvvq

}

本文来自zvvq

``` 内容来自zvvq

copyright zvvq

以上就是Vue中非父子组件传值的三种方式:事件总线、Vuex和provide/inject。每种方式都有其适用的场景,我们可以根据具体情况选择合适的方式来实现非父子组件传值。

本文来自zvvq