
在 Vue 中,组件通信是非常核心的知识点,除了递归组件中常用的 props 传递方式外,还有多种常用的组件通信方式,适用于不同的场景:
:propName="value" 向子组件传值this.$emit('eventName', data) 触发事件,父组件用 @eventName 监听// 父组件
<ChildComponent :message="parentMsg" @handleChange="handleChange" />
// 子组件
export default {
props: ['message'],
methods: {
sendData() {
this.$emit('handleChange', '来自子组件的数据')
}
}
}this.$parent 获取父组件实例this.$children 获取子组件实例数组// 子组件中访问父组件
this.$parent.parentMethod()
// 父组件中访问子组件
this.$children[0].childMethod()ref 属性,如 <Child ref="childRef" />this.$refs.childRef 获取子组件实例// 父组件
<ChildComponent ref="child" />
// 父组件中调用
this.$refs.child.childMethod()provide 提供数据inject 注入数据// 祖先组件
export default {
provide() {
return {
theme: 'dark',
changeTheme: this.changeTheme
}
},
methods: {
changeTheme() { ... }
}
}
// 后代组件
export default {
inject: ['theme', 'changeTheme'],
mounted() {
console.log(this.theme) // 'dark'
}
}$emit 触发事件,接收方用 $on 监听事件// main.js 中创建
Vue.prototype.$bus = new Vue()
// 组件A发送事件
this.$bus.$emit('eventName', data)
// 组件B接收事件
mounted() {
this.$bus.$on('eventName', (data) => {
console.log(data)
})
}
// 组件B销毁时移除监听
beforeDestroy() {
this.$bus.$off('eventName')
}// store.js
import { defineStore } from 'pinia'
export const useStore = defineStore('main', {
state: () => ({ count: 0 }),
actions: {
increment() {
this.count++
}
}
})
// 组件中使用
import { useStore } from './store'
const store = useStore()
console.log(store.count) // 访问状态
store.increment() // 调用方法$attrs 包含父组件传递的非props属性$listeners 包含父组件传递的事件监听器// 中间组件
<ChildComponent v-bind="$attrs" v-on="$listeners" />parent/$children
根据项目规模和组件关系选择合适的通信方式,可以使代码更清晰、维护性更好。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。