$listeners方便隔代传值,用于底层组件向高级层组件传递信息。
例如有 父组件A,子组件B,孙组件C 三个组件,如果C传递信息给B则可直接使用$emit,如果是C向A传递信息还使用$emit,则就需要C先$emit给B,B再$emit给A,这种方式比较繁琐,则此时可以使用v-on=”$listeners”来满足当前需求。
C组件
<template>
<div @click="onClick">C组件</div>
</template>
onClick(){
this.$emit("Msg",'123')
}
B组件
<template> <cCom v-on="$listeners"/> </template>
A组件
<template>
<bCom @Msg='Msg'/>
</template>
methods:{
Msg(val){
console.log(val) //123
}
}
隔代传值这里还是推荐使用,evenbus
Vue2参考,https://sdeno.com/?p=6302 ,里面搜索bus
vue3,
npm i mitt -S
修改/src/main.js
import mitt from 'mitt'
app.config.globalProperties.$bus = mitt()
发送数据
methods:{
test(){
this.$bus.emit('sendvalue',{a:1})
}
}
接收数据
mounted() {
this.$bus.on('sendvalue',(res)=>{
console.log(res) //{a:1}
})
}
beforeUnmount() {
this.$bus.all.delete("sendvalue") //防止多次触发on事件
},
this.$bus.on('*', (type, e) => console.log(type, e) ) //监听所有