一,前言
1.当我们有一个应用涉及的组件层数较深时,若涉及到父组件要向其子组件的子组件的子组件… 传递数据时,我们可以使用props 或者$attrs ,
2.然而这两种都不是最适合的,都需要在中间组件中一层一层的往下传递。
3.对于这种情况,我们可以使用一对 provide 和 inject 。无论组件层次结构有多深,父组件都可以作为其所有子组件的依赖提供者。
二,父组件provide
1.在vue2 中provide 使用
{
provide:{
mode:"view"
}
}
2.若要在provide 中使用组件实例this 时,需要将provide 变成函数形式
{
provide{
mode:this.mode
},
provide(){
return {
mode:this.mode
}
}
}
三,子组件inject
1.在vue2 中inject 使用
{
inject:["mode"]
}
2.不管层次多深,只要属于子组件,都可以接收到父组件的provide
3.inject 可以像data 和props 被this 访问到,也可以直接用于模板内。
四,响应性
1.provide 和inject 默认是没有响应性的
2.在vue2 中,我们可以使用Vue.computed 让provide 具有响应性
provide() {
return {
mode:this.mode,
mode: Vue.computed(() => this.mode)
}
}
五,vue3 中provide 和inject
1.在vue3 中provide 和inject 被归于组合式api ,需要显式导入
import { provide ,inject ,ref} from "vue"
const mode = ref("view")
provide("mode","view")
provide("mode", mode )
const mode = inject("mode","defaultValue")
2.vue3 中要使provide 和inject 具有响应式,只要传递一个ref 或者reactive 即可
|