vue 不使用 vuex 进行组件间传值
简单的传值不必非要使用 vuex
子组件向父组件传值
假设 子组件 A 向父组件 B 发送数据。
|-compontens
| |-- A.vue
| |-- B.vue
子组件 A.vue 内容容下
<template>
<button @click="sentMessage()" >传递消息给父组件</button>
</template>
<script>
export default {
data(){
return{
}
},
methods:{
sentMessage:function(){
this.$emit('NewsToFather','hi,父组件')
}
}
}
</script>
<style lang="scss" scoped>
</style>
使用 this.$emit() 发送一个 key 为'NewsToFather',value 为'hi,父组件' 的数据。
子组件 A 发送后消息后,需要父组件去获取这个数据
父组件 B.vue 内容如下
<template>
<child :message="parentMessage" @NewsToFather="showMsgFromChild"></c>
</template>
<script>
import child from './a.vue'
export default {
data(){
return{
parentMessage: 'I am a father',
}
},
methods:{
showMsgFromChild:funcation(data){
console.log(data) // hi,父组件
}
},
components:{
Child
}
}
</script>
<style lang="scss" scoped>
</style>
兄弟组件间传值
因为兄弟组件之间实际上是无法互通的,所以我们需要一个能在这两个组件之间『中转』的角色。
假设:组件 A 和组件 B 是兄弟节点,文件结构如:
|-compontens
| |-- A.vue
| |-- B.vue
这时候,我们需要一个中转文件,不妨起名为 bus.js,我把这个文件放在 assets 文件夹下
bus.js 的内容如下:
import Vue from 'Vue'
export default new Vue()
|-assets
| |-- bus.js
|-compontens
| |-- A.vue
| |-- B.vue
用于中转的东西有了后,我们需要让 A B组件都能和 bus 产生交流
所以在 A.vue 和 B.vue 中的<script></script>
中都加入下列代码
<script>
import bus from '../assets/bus.js'
export default {
//......
}
</script>
现在 A B 这个兄弟组件之间就能产生交流了,现在我们让 A 组件向 发送数据(实质上是让A组件中的 bus 发送数据)。
假设 A.vue 是如下内容
<template>
<button @click="sentMessage()" >传递消息给 B</button>
</template>
<script>
import bus from '../../assets/bus.js'
export default {
data(){
return{
message:'你好啊,B'
}
},
methods:{
sentMessage:function(){
let data =this.message
bus.$emit('NewsToB',data)
}
}
}
</script>
<style lang="scss" scoped>
</style>
A 组件中的 sentMessage
方法调用bus.$emit('NewsToB',data)
语句,这会让咱们的 bus 发送一个 key为'NewsToB'
,value为data
的数据。
A组件发送了内容,B组件怎么接收内容呢?
假设 B.vue 是这样的:
<template>
</template>
<script>
import bus from '../../assets/bus.js'
export default {
data(){
return{
grapevines: [],
}
},
created(){
bus.$on('NewsToB',(data)=>{
console.log(data) //'你好啊,B'
}
})
}
}
</script>
<style lang="scss" scoped>
</style>
组件 B 让 bus 用$on
来监听,在这里我们监听的'NewsToB'
正好是 A 组件让bus传递的数据,这样一来我们就在 B 组件中获取到了 A 组件的数据
bus.$on('NewsToB',(data)=>{
console.log(data) //'你好啊,B'
}
})
简单总结一下,三个步骤
- 找一个中间角色 bus,让 AB 组件都和中间角色产生联系(important bus from '../../assets/bus.js')
- A 组件中的 bus 发送一个信息(bus.$emit('NewsToB',data))
- B 组件中的 bus 接受一个信息 bus.$on('NewsToB',(data)=>{})