Vue3源码:选项式API中的data如何响应化?

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,检查属性是否冲突

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

这段代码整体上是为开发过程中的调试和错误检测提供支持的。通过将 data 中的属性暴露到上下文中,开发者可以更方便地在开发者工具中观察和调试组件的状态。

文章评论区

欢迎留言交流

未登录,请先注册或登录后发表评论。

Leave comment