We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
最常规的父子组件传值方法,在此不多赘述
值得一提的是,子组件中可以用 $attrs 获取父组件传来的所有属性(除了 class、style),从而不用一个个声明 prop。
$attrs
prop
如果不用 prop 声明接收,Vue 会默认将这些属性挂载到 子组件的 dom 根元素上。如果不希望这样,可以设置 inheritAttrs 去除这一默认行为。
inheritAttrs
export default { inheritAttrs: false }
如果需要传给更深一层的子组件,只需通过 v-bind="$attrs" 传入
v-bind="$attrs"
除了 $emit 可以向父组件分发事件之外
$emit
还有一个与 $attrs 类似的一个 api :$listener,可以拿到父组件上的所有事件监听器。同样的,v-on="$listeners" 可以将之传给更深一层的子组件
$listener
v-on="$listeners"
通过 $listeners.xxx 可以直接触发父组件的 xxx 监听器
$listeners.xxx
插槽最常见的用法是:在子组件中使用 slot 插槽,在父组件中对其进行填充,可以是具名插槽也可以是匿名插槽。
slot
除了这种用法以外,父组件还可以拿到子组件在插槽上传递的数据,也就是作用域插槽:
子组件中通过 v-bind 绑定数据
<template> <div class="child"> <slot v-bind:data="data"></slot> </div> </template>
父组件中可以通过 v-slot 接收
v-slot
<child v-slot:default="slotData"> {{ slotData.data }} </child>
父组件可以将一些共享的数据注入,后代通过 inject 选项接收后直接可以使用,这些数据将会是共享的。
inject
// 父组件中 provide(){ return { parentData: this.data } } // 子组件中 inject: ['parentData'] // 通过 this.parentData 即可访问
甚至,你还可以将父组件整个共享:
provide(){ return { parent: this } }
通过 this.$parent 可以访问到父组件的数据,this.$parent.$parent 可以访问到爷组件。
this.$parent
this.$parent.$parent
与此类似,还有 this.$children
this.$children
但是过度使用可能会造成代码混乱,尤其是组件嵌套很深时。
// 父组件 data(){ return { bus: new Vue() } } provide(){ return { eventBus: this.bus } }
这里借用到上面的注入方法,不过这次注入的是一个 Vue 实例,原因是:这里注入的内容应该是一个事件中心,刚好 Vue 实例提供了 $on $emit 方法,我们可以直接借用
$on $emit
至于为什么要放在 data 中,是因为这样父组件也可以拿到这个 eventBus,也可以进行事件的监听和分发。
data
eventBus
在其他组件中接收这个事件中心:
inject: ['eventBus']
当需要监听事件时,只需要通过 $on 添加事件监听器即可:
$on
this.eventBus.$on('change', (data) => { // ... })
当分发一个事件后,所有监听了这个事件的组件都会触发回调,拿到传递的数据:
this.$eventBus.$emit('change', someData)
The text was updated successfully, but these errors were encountered:
No branches or pull requests
Vue 组件通信
父子组件通信
1. props
最常规的父子组件传值方法,在此不多赘述
值得一提的是,子组件中可以用
$attrs
获取父组件传来的所有属性(除了 class、style),从而不用一个个声明prop
。如果不用
prop
声明接收,Vue 会默认将这些属性挂载到 子组件的 dom 根元素上。如果不希望这样,可以设置inheritAttrs
去除这一默认行为。如果需要传给更深一层的子组件,只需通过
v-bind="$attrs"
传入2. 分发事件
除了
$emit
可以向父组件分发事件之外还有一个与
$attrs
类似的一个 api :$listener
,可以拿到父组件上的所有事件监听器。同样的,v-on="$listeners"
可以将之传给更深一层的子组件通过
$listeners.xxx
可以直接触发父组件的 xxx 监听器3. 插槽
插槽最常见的用法是:在子组件中使用
slot
插槽,在父组件中对其进行填充,可以是具名插槽也可以是匿名插槽。除了这种用法以外,父组件还可以拿到子组件在插槽上传递的数据,也就是作用域插槽:
子组件中通过 v-bind 绑定数据
父组件中可以通过
v-slot
接收4. 父组件的共享 — 注入
父组件可以将一些共享的数据注入,后代通过
inject
选项接收后直接可以使用,这些数据将会是共享的。甚至,你还可以将父组件整个共享:
5. 父链子链
通过
this.$parent
可以访问到父组件的数据,this.$parent.$parent
可以访问到爷组件。与此类似,还有
this.$children
但是过度使用可能会造成代码混乱,尤其是组件嵌套很深时。
非父子组件通信
eventBus
这里借用到上面的注入方法,不过这次注入的是一个 Vue 实例,原因是:这里注入的内容应该是一个事件中心,刚好 Vue 实例提供了
$on $emit
方法,我们可以直接借用至于为什么要放在
data
中,是因为这样父组件也可以拿到这个eventBus
,也可以进行事件的监听和分发。在其他组件中接收这个事件中心:
当需要监听事件时,只需要通过
$on
添加事件监听器即可:当分发一个事件后,所有监听了这个事件的组件都会触发回调,拿到传递的数据:
The text was updated successfully, but these errors were encountered: