Vue3源码解析计划之组件渲染,VNode如何转为实在DOM

时间:2021-12-13 21:16来源:http://www.shopwholesalejerseys.com 作者:13岁这水水逼太嫩了-这水水逼太嫩了-19岁又紧水又多 点击:
WOT全球技术创新大会2022,门票6折抢购中!购票立减2320元!

1写在前线

在VUE中,组件是一个专门主要的概念,整个行使的页面都是经由过程组件进走渲染实现的,但是吾们在编写组件时,它们内部又是如何进走做事的呢?从吾们开起编写组件,到最后转为实在DOM,是一个怎样的变化过程呢?那么吾们答该先来晓畅vue3中组件时如何渲染的?

2组件

组件是一个抽象概念,它是对一棵DOM树的抽象,在页面写一个组件节点:,它并不会在页面上渲染这个叫的标签。吾们在写组件时,答该内部时云云的:

<template>     <div class="test">     <p>hello world</p>   </div>   </template

那么,一个组件想要真实渲染成DOM必要以下几个步骤:

创建VNode 渲染VNode 生成实在DOM

这边的VNode是什么,其实就是能够描述组件新闻的Javascript对象。

3行使程序初起化

一个组件能够经由过程"模板+对象描述"的手段创建组件,创建益后又是如何被调用并进走初起化的呢?

由于整个组件树是从根组件开起进走渲染的,要追求到根组件的渲染入口,必要从行使程序的初起化过程开起分析。

吾们别离望下vue2和vue3初起化行使代码有啥不同,但其实没众大不同。

//vue2  import Vue from "vue"; import App from "./App";  const app = new Vue({     render:h=>h(App); })  app.$mount("#app");  //vue3 import {createApp} from "vue"; import App from "./app"; const app = createApp(App); app.mount("#app"); 

接下来吾们望望createApp内部实现:

export const createApp = ((...args) => {   //创建app对象   const app = ensureRenderer().createApp(...args)    if (__DEV__) {     injectNativeTagCheck(app)   }    const { mount } = app     //重写mount手段   app.mount = (containerOrSelector: Element | string): any => {     const container = normalizeContainer(containerOrSelector)     if (!container) return     const component = app._component     if (!isFunction(component) && !component.render && !component.template) {       component.template = container.innerHTML     }     // clear content before mounting     container.innerHTML = ''     const proxy = mount(container)     container.removeAttribute('v-cloak')     return proxy   }    return app }) as CreateAppFunction<Element

吾们望到const app = ensureRenderer().createApp(...args)用来创建app对象,那么其内部是如何实现的:

//渲染有关的一些配置,比如:更新属性的手段,操作DOM的手段 const rendererOptions = {   patchProp,  // 处理 props 属性    ...nodeOps // 处理 DOM 节点操作 }  // lazy create the renderer - this makes core renderer logic tree-shakable // in case the user only imports reactivity utilities from Vue.  let renderer: Renderer | HydrationRenderer  let enabledHydration = false // 吾们望到中文翻译就是:延时创建渲染器,当用户只倚赖相答式包的时候,不会立即创建渲染器, // 能够经由过程tree-shakable移除中央渲染逻辑有关的代码 function ensureRenderer() {   return renderer 
          
网站分类
相关内容
热点内容
相关站点
友情链接
返回顶部