createApp({}).mount(‘#app')
is similar to vue2.x’s Watcher, computed, watch, componentUpdateFn also uses ReactiveEffect during the rendering process,const effect = new ReactiveEffect(fn,…), in addition to the calculated attribute, effect.run() will be called when it is accessed ->Call fn(), access the responsive variable in fn, and collect Dependencies, the rest of setupRenderEffect, watch, watchEffect, will call effect.run() after creating ReactiveEffect to collect dependencies, among which
will access the dependent response Variable
will execute the function that accesses the source and collects dependencies
, will automatically execute fn to collect dependencies
// 1.计算属性 // computed.ts // ComputedRefImpl类构造函数调用了new ReactiveEffect this.effect = new ReactiveEffect(getter, () => { if (!this._dirty) { this._dirty = true triggerRefValue(this) } }) // 2. effect // effect.ts // effect函数中,可以接收第二个参数effect(fn,{lazy:true}),表示不立即执行 const _effect = new ReactiveEffect(fn) // 3. apiWatch.ts doWatch方法 // watch和watchEffect都是通过doWatch函数来,在这里调用new ReactiveEffect,然后根据不同情况执行effect.run(),对于watchEffect就是//执行器回调,对于watch就是访问监听的数据,然后收集依赖 const effect = new ReactiveEffect(getter, scheduler) // 4. render.ts //在 setupRenderEffect中 const effect = (instance.effect = new ReactiveEffect( componentUpdateFn,//更新组件函数 () => queueJob(update), instance.scope // track it in component's effect scope ))
Functional and class decorators are well supported in TypeScript. Using function calls can better support TypeScript, thus improving type support3. The api of the root component, such as data and child The API of the component remains in the same format, and the mounting is changed from $mount to mount, which simplifies the API and unifies the consistency of the API 4. The mounting method in new Vue will cause global pollution and cannot be independent , createApp can be independent of each other and mounted on demand. Process implementation
const Vue = { createApp(options) { //返回app实例 return { mount(selector){ // 获取渲染函数,编译结果 // 渲染dom,追加到宿主元素 } compile(template){ //返回render return function render(){ //描述视图 } } } } }
createApp
The two initialization functions exposed by Vue, createApp and createRenderer, the calling relationship between them
/*暴露给Vue的createApp*/ function createApp(options){ const renderer = Vue.createRenderer({ /*定义一些平台特有的api,一些实例*/ aaa(){}, bbb(){} }) /*用户调用的createApp,实际上是渲染器的createApp*/ return renderer.createApp() } function createRenderer({aaa,bbb}){ /*获得渲染器*/ /*这个createApp是函数内部的*/ return createApp(options){ /*挂载逻辑*/ return { /*返回App实例*/ } } }
1. The user calls the createApp method =》 Obtain the renderer through ensureRenderer2. The renderer calls createRender=》※Call the factory function baseGreateRenderer. This function defines patches, diffs, etc., and will eventually return a render is used to render the spa page, a hydrate is used to inject water into the ssr page, and there is a function createApp (different from Vue's createApp) 3. In the function createApp, an instance of the program will be defined Methods, such as mount, get, set, use, mixin, etc.4. The mount instance method will check whether there is a root component mounted and what method to use for mounting (spa/ssr)5. The render method calls the patch method for patching 6. The patch method determines the mounting method based on the incoming node type. If it is mounted for the first time, it will be mounted on component, and then element( The patch method will convert vnode into a node node)7. The patch method executes the internal processComponent method, and finally executes the mountComponent method, which is the final execution method of $mount in Vue2Initialization process1. Instantiation of the root component: call createComponentInstance2. Initialization of the root component: call the setupComponent method, which is the this.$_init method in Vue2, to merge options and set Hooks and responsiveness3. Install the side effect function of the render function: setupRendererEffect
In Vue3, the watcher was canceled and replaced with a side effect function. The side effect function will be re-executed every time the responsive data changes. The execution of the internal render function will trigger dependency collection, so that when the responsive data changes, the response The component will be updated.
PS: The difference from useEffect in react is that useEffect requires manual collection of dependencies, while effect() in Vue will automatically collect dependencies.
The above is the detailed content of How to call functions during Vue3 initialization. For more information, please follow other related articles on the PHP Chinese website!