「这是我参与2022首次更文挑战的第26天,活动详情查看:2022首次更文挑战」。
前言
书接上回,我们接下来来继续处理后面两个问题:它和其他data之间是什么关系,如果data和这些数据发生冲突,他们能共存么,Vue3处理时候的行为是什么?setup中的生命周期Vue中是怎么来处理的?
data冲突怎么办?
假设我们在data中和setup中同时定义一个变量counter,那么在实际运行中,Vue3是怎么对这些数据进行处理呢?
我们可以直接使用运行代码来比对,setup优先级会看起来更高,且无论是data还是setup,两者均可在页面中使用,因此二者可共存。那么 Vue3中是如何对这个问题进行处理的呢?
接下来我们来进行这个问题的探究:
从setupCompoent开始,接下来是setupStatefulComponent,
这里我们对组件的上下文进行了代理行为,并且在PublicInstanceProxyHandlers中进行了处理:
在其中取出了setupState、data、接下来对参数进行处理
依次分别从setup、data、ctx、props中来进行参数的获取
综上所诉: Vue3中的处理是,对组件实例上下文instance.ctx进行了代理,并且在PublicInstacneHandlers的get中会做逻辑判断处理,优先从setupState中获取,其次是data,再其次是ctx,props
Composition生命周期钩子是如何工作的
Composition中使用生命周期钩子,我们可以使用vue导出的生命周期钩子,下表包含了可以在setup中调用的生命周期钩子
想知道生命周期钩子是如何被处理的,我们可以在源码中comand + p 搜索 #onMounted,对应文件在apiLifecycle文件中
从代码中我们可以看出来,所有的生命周期都来自于createHook方法,也就是说我们了解生命周期方法的话,需要从这里入手
查看createHook方法
这个方法进行了一个偏函数的处理,第一个入参是当前的生命周期,第二个方法入参是当前的执行函数和目标(默认当前实例)
最终注入了一个hook,下个方法就是injectHook
这个方法首先使用错误处理包装了一下注入的hook,然后接下来将处理过的hook放在hooks字段。也就是说我们setup中运行的生命周期其实并不会被立刻运行,这里只是将其放在hooks中。
这部分差不多就研究到这里了,其实这部分还有很多的知识我们还没有讲到,比如provide/inject的处理、getCurrentInstance获取当前组件实例是怎么做的,大家可以自己研究一下。