
Vue3源码:选项式API中的data如何响应化?
mount挂载过程中,render函数中patch是核心部分【Vue3源码debugger:createApp以及mount挂载】【patch内部】app._instance的值为vnode的component选项的data响应化在该部分内部完成进入内部processComponent中处理“...
2024年7月31日
720字
mount挂载过程中,render函数中patch是核心部分【Vue3源码debugger:createApp以及mount挂载】
【patch内部】
app._instance的值为vnode的component
选项的data响应化在该部分内部完成

进入内部processComponent中处理“选项”

然后进入mountComponent方法中

setupComponent

下图中的setupStatefulComponent进行了data的响应化(还有其他选项的初始化构建)

进入finishComponentSetup
进入installWithProxy

applyOptions处理各选项

applyOptions中的data处理(applyOptions里面还执行了处理methods等其他选项的初始化)

- 711~726行代码表明:
- data是要以函数传入,并且返回一个普通对象
- data不能是普通对象:内存地址的污染
- data不能是异步函数:在构建过程中直接用 await 等待异步函数完成,这种方式是行不通的。Vue 的选项式 API 的 data 必须是一个同步函数。这是因为 Vue 需要在组件实例创建时立即访问并处理 data 中的数据来设置响应式系统和初始渲染。
- 728行代码则是响应化data
这里的debugger可以直接将vue中的data设置一个对象,控制台有了报警提示,再debugger更加容易。。。
checkDuplicateProperties,检查属性是否冲突


- 检查重复属性 (
checkDuplicateProperties): 这一步确保在定义组件的数据时,没有重复的属性名。在开发模式下,这个函数会检查data中的属性名是否与其他选项(如props、methods等)冲突,并在发现冲突时发出警告。 - 在开发环境中暴露
data到上下文 (ctx): 在开发模式下,这段代码会将data中的每个属性暴露到ctx上下文中,以便在调试时更容易访问组件的状态。这是通过Object.defineProperty方法实现的,该方法为ctx对象定义了一个新的属性。configurable: true和enumerable: true使得这些属性可以被枚举和重新定义。get函数返回data对应属性的值,而set函数被设置为NOOP,即一个空操作,防止直接修改ctx上的这些属性。 - 过滤保留前缀 (
isReservedPrefix): 这一步检查属性名的第一个字符是否是保留的前缀(例如_或$),这些前缀通常用于框架内部使用,避免这些属性暴露到ctx中。
这段代码整体上是为开发过程中的调试和错误检测提供支持的。通过将 data 中的属性暴露到上下文中,开发者可以更方便地在开发者工具中观察和调试组件的状态。

文章评论区
欢迎留言交流