在Vue中,父子组件之间的传值是非常常见的。但是,在一些特殊的情况下,我们需要在非父子组件之间传递数据。这时,我们可以使用一些其他的方法来实现非父子组件传值。 zvvq.cn
. 使用事件总线 内容来自samhan666
事件总线是Vue中常用的一种非父子组件传值的方式。可以通过创建一个Vue实例作为事件总线,然后在需要传值的组件中$emit一个事件,在接收数据的组件中$on这个事件来接收数据。 内容来自zvvq,别采集哟
以下是一个简单的示例:
内容来自zvvq,别采集哟
在事件总线中创建一个Vue实例: 内容来自zvvq
``` 内容来自zvvq
// eventBus.js 内容来自samhan
import Vue from &;vue&; 本文来自zvvq
export const eventBus = new Vue() zvvq.cn
``` zvvq.cn
在需要传值的组件中$emit一个事件: 本文来自zvvq
``` zvvq好,好zvvq
// ComponentA.vue 本文来自zvvq
import { eventBus } from &;./eventBus.js&; zvvq.cn
export default { zvvq.cn
methods: { 内容来自samhan666
sendData() {
zvvq好,好zvvq
eventBus.$emit(&;data&;, &;hello world&;) 内容来自zvvq,别采集哟
} zvvq
} 本文来自zvvq
} zvvq
```
在接收数据的组件中$on这个事件来接收数据:
copyright zvvq
```
// ComponentB.vue
zvvq.cn
import { eventBus } from &;./eventBus.js&; 本文来自zvvq
export default { zvvq.cn
data() {
本文来自zvvq
return { zvvq
message: &;&;
zvvq好,好zvvq
} 内容来自zvvq
}, zvvq.cn
created() { copyright zvvq
eventBus.$on(&;data&;, message => { 内容来自samhan666
this.message = message 本文来自zvvq
})
内容来自zvvq,别采集哟
} 内容来自zvvq,别采集哟
}
```
zvvq.cn
. 使用Vuex
Vuex是Vue官方提供的一种状态管理库,它可以用来管理全局共享的状态。我们可以在Vuex中定义一个全局变量来存储需要传递的数据,在需要传值的组件中$dispatch一个action,然后在接收数据的组件中$watch这个全局变量来接收数据。 内容来自zvvq,别采集哟
以下是一个简单的示例: 本文来自zvvq
在Vuex中定义一个全局变量: 内容来自zvvq,别采集哟
``` zvvq
// store.js copyright zvvq
import Vue from &;vue&; zvvq.cn
import Vuex from &;vuex&;
zvvq
Vue.use(Vuex)
copyright zvvq
export default new Vuex.Store({ 本文来自zvvq
state: { 内容来自samhan666
message: &;&; zvvq.cn
}, 本文来自zvvq
mutations: {
setMessage(state, message) { zvvq好,好zvvq
state.message = message
zvvq
}
}
}) 本文来自zvvq
```
在需要传值的组件中$dispatch一个action: zvvq好,好zvvq
```
本文来自zvvq
// ComponentA.vue 内容来自samhan
import store from &;./store.js&; 本文来自zvvq
export default { zvvq
methods: { 内容来自zvvq
sendData() { 内容来自samhan666
store.commit(&;setMessage&;, &;hello world&;)
copyright zvvq
}
} 内容来自zvvq,别采集哟
} zvvq好,好zvvq
```
内容来自samhan
在接收数据的组件中$watch这个全局变量来接收数据:
```
内容来自samhan666
// ComponentB.vue
import store from &;./store.js&;
export default { 内容来自zvvq
data() { zvvq好,好zvvq
return { 内容来自samhan666
message: &;&;
}
},
zvvq
created() { 内容来自samhan666
this.$watch(() => store.state.message, message => {
this.message = message copyright zvvq
}) 内容来自zvvq
} copyright zvvq
}
本文来自zvvq
```
. 使用provide/inject
Vue提供了provide/inject这种API来实现非父子组件传值。它可以在祖先组件中provide一个数据,然后在后代组件中inject这个数据来使用。 内容来自zvvq,别采集哟
以下是一个简单的示例: zvvq好,好zvvq
在祖先组件中provide一个数据: 内容来自samhan
``` 内容来自zvvq
// Ancestor.vue
export default { 内容来自zvvq,别采集哟
provide() {
return {
内容来自samhan666
message: &;hello world&;
copyright zvvq
} zvvq好,好zvvq
} copyright zvvq
}
``` zvvq.cn
在后代组件中inject这个数据来使用:
内容来自samhan
``` 内容来自samhan666
// Descendant.vue copyright zvvq
export default {
inject: [&;message&;],
zvvq好,好zvvq
mounted() {
console.log(this.message) // hello world
内容来自samhan666
}
zvvq好,好zvvq
} 内容来自zvvq
``` zvvq.cn
本文来自zvvq
以上就是Vue中非父子组件传值的三种方式:事件总线、Vuex和provide/inject。每种方式都有其适用的场景,我们可以根据具体情况选择合适的方式来实现非父子组件传值。
zvvq好,好zvvq