深入理解Vue中的provide和inject函数
在Vue中,provide和inject函数是用来实现数据多级传递的。如果你没有看过这两个函数的源码,可能会觉得它们的实现非常神秘。但实际上,它们的源码非常简单。本文将深入讲解provide和inject函数是如何实现数据多级传递的。值得一提的是,本文中使用的Vue版本为3.5.13。
如果你想深入学习Vue,欢迎关注公众号:【前端欧阳】,给自己一个进阶Vue的机会。
接下来,我们先来看一个demo。以下是一个父组件的代码:
在父组件中使用provide函数为后代组件注入一个名为count的响应式变量。
接下来,让我们来看子组件child.vue的代码:
从上面的代码可以看到,子组件中并没有做任何事情,只是渲染了孙子组件。
接下来,让我们来看孙子组件grand-child.vue的代码:
从上面的代码可以看到,在孙子组件中使用inject函数成功获取了父组件中注入的count响应式变量。
接下来,让我们来深入了解provide函数。
首先,我们来debug provide函数的代码。给父组件中的provide函数打个断点,如下图:
刷新页面,代码将会停留在断点处。让断点走进provide函数,代码如下:
...
接下来,让我们来看inject函数。
同样地,给孙子组件中的inject函数打个断点。如下图:
将断点走进inject函数,代码如下:
...
最后,让我们对本文进行总结。
本文深入讲解了使用provide和inject函数是如何实现数据多级传递的。
在创建Vue组件实例时,子组件的provides属性对象会直接使用父组件的provides属性对象。如果在子组件中使用了provide函数,那么会以父组件的provides属性对象为原型创建一个新的provides属性对象,并且将provide函数中注入的内容塞到新的provides属性对象中,从而形成了原型链。
在孙子组件中,他的parent就是子组件。如果没有在组件内使用provide注入东西,那么就会直接使用他的父组件的provides属性对象,所以这里的子组件是直接使用的是父组件中的provides属性对象。因此,在孙子组件中可以直接使用inject函数拿到父组件中注入的内容。
欢迎关注公众号:【前端欧阳】,给自己一个进阶Vue的机会。
另外,欧阳写了一本开源电子书《vue3编译原理揭秘》,看完这本书可以让你对Vue编译的认知有质的提升。这本书初、中级前端都能看懂,完全免费,只求一个star。