1、provide/inject有什么用?
常用的父子组件通信方式都是父组件绑定要传递给子组件的数据,子组件通过props
属性接收,一旦组件层级变多时,采用这种方式一级一级传递值非常麻烦,而且代码可读性不高,不便后期维护。
vue
提供了provide
和inject
帮助我们解决多层次嵌套嵌套通信问题。在provide
中指定要传递给子孙组件的数据,子孙组件通过inject
注入祖父组件传递过来的数据。
其实,provide
和 inject
主要为高阶插件/组件库提供用例。并不推荐直接用于应用程序代码中。比如elementUI
组件库中:
在el-form
组件中将组件实例暴露给子孙组件
在el-form-item
组件中注入el-form
组件实例,然后就可以使用el-form
组件实例的方法、变量等等。
为什么不使用父子组件props传值呢?
因为父子组件props
传值需要需要知道往哪一个子组件传值,而el-form
组件中会注入的子组件是不确定的。provide
只需要将传递的值抛出,不需要知道使用哪一个子组件,子组件通过inject
注入获取数据,也不需要知道父组件是谁,因此再封装组件库的时候很便利。
不推荐直接使用在应用程序代码中是因为数据追踪比较困难,不知道是哪一个层级声明了这个或者不知道哪一层级或若干个层级使用了。
2、provide/inject使用方式
provide
:是一个对象,或者是一个返回对象的函数。里面呢就包含要给子孙后代的东西,也就是属性和属性值。注意:子孙层的provide
会掩盖祖父层provide
中相同key
的属性值
inject
:一个字符串数组,或者是一个对象。属性值可以是一个对象,包含from
和default
默认值,from
是在可用的注入内容中搜索用的 key
(字符串或 Symbol
),意思就是祖父多层provide
提供了很多数据,from
属性指定取哪一个key
;default
指定默认值。
3、例子
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>provide + inject</title>
<script src="https://cdn.bootcss.com/vue/2.6.11/vue.min.js"></script>
</head>
<body>
<div id="app"></div>
</body>
</html>
<script>
Vue.component('A', {
template: `
<div>
<B></B>
</div>
`,
provide: {
msg: '1234124'
}
})
Vue.component('B', {
template: `
<div>
<label>B:</label>
<span>{{ this.msg }}</span>
<C></C>
</div>
`,
provide: {
msg: '42341234',
name: 'asdasda'
},
inject: ['msg'],
})
Vue.component('C', {
template: `
<div>
<label>C:</label>
<span>{{ this.xingming }}</span>
<span>{{ this.msg }}</span>
</div>
`,
inject: {
xingming: {
from: 'name',
default: ''
},
msg: {
from: 'msg',
default: ''
}
},
data() {
return {
}
},
})
var app=new Vue({
el: '#app',
template: `
<div>
<A />
</div>
`
});
</script>
结果:
参考:
https://blog.csdn.net/viewyu12345/article/details/83011618
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。