最近在重学vue的内容,看到一个vue的高级特性,以解决多层组件间的通信问题(这种解决方法在平常处理业务逻辑中较少使用,在通用式组件中会大量使用)。
图片:clipboard.png ![]() 如果按照一般的操作,假如E组件要和I组件进行通信,就是要使用props属性和$emit方法进行通信,这种操作是脆弱的,并且消耗的资源也很大,provide与inject就是为了处理多层组件间的通信而诞生的。 provide提供数据,inject注入数据,E节点和A节点及逆行通信的时候(或者说E节点去A节点获取数据时),通过层层冒泡的一个形式到A节点去取数据 A组件中,provide提供数据: provide() { //provide提供数据 return { themes: this }; }, data() { return { color: "yellow" }; }, E、F节点中获取数据: inject: { themes: { default: () => ({}) } }, inject: { theme1: { //为了避免名字重复起的别名 from: "theme", //真名在这个from中 default: () => ({}) } } I节点使用的函数式组件,所以取值不一样: inject: { theme: { default: () => ({}) } } <template functional> <div class="border2"> <h3 :style="{ color: injections.theme.color }">I 结点</h3> </div> </template> provide里边提供的数据默认不是响应式的数据,假如在C节点中提供一个provide,包含theme,那么就只会找到C节点就不会再向上查找了(类似于事件冒泡机制)。 |
|
沙发#
发布于:2020-02-24 09:54
666
|
|
|
板凳#
发布于:2020-02-23 19:50
demo代码贴在github上的,感兴趣的可以看一下 https://github.com/exwangwei/provideAndInject
|
|