Vue虚拟dom是如何被创建的

本文详细介绍了Vue虚拟DOM的创建过程,从入口文件开始,逐步剖析`makeNode`函数如何处理静态节点,以及`patch`方法在渲染阶段的角色。文章还探讨了`render`函数的生成,以及在不同数据类型的处理方式,如基础数据类型、数组和对象,最终生成真实DOM的过程。
摘要由CSDN通过智能技术生成

先来看生成虚拟dom的入口文件:

  ...
  import {
    parse } from './parser/index'
  import {
    optimize } from './optimizer'
  import {
    generate } from './codegen/index'
  ...
   const ast = parse(template.trim(), options)
  if (options.optimize !== false) {
   
    optimize(ast, options)
  }
  const code = generate(ast, options)
  ...

我们看到了AST经过三轮加工,最终脱胎换骨成为render function code。那么我们这一章就来讲AST的第三次试炼。入口文件./codegen/index

export function generate (
ast: ASTElement | void,
options: CompilerOptions
): CodegenResult {
   
const state = new CodegenState(options)
const code = ast ? genElement(ast, state) : '_c("div")'
return {
   
  render: `with(this){return ${
     code}}`,
  staticRenderFns: state.staticRenderFns
}
}

我们来看generate函数内部构造,返回render是一个with(this){return ${code}}包起来的一串东西,staticRenderFns是在编译过程中会把那些不会变的静态节点打上标记,设置为true,然后在渲染阶段单独渲染
那么genElement函数的作用是什么呢?

export function genElement (el: ASTElement, state: CodegenState): string {
   
  if (el.staticRoot && !el.staticProcessed) {
   
    return genStatic(el, state)
  } else if (el.once && !el.onceProcessed) {
   
    return genOnce(el, state)
  } else if (el.for && !el.forProcessed) {
   
    return genFor(el, state)
  } else if (el.if && !el.ifProcessed) {
   
    return genIf(el, state)
  } else if (el.tag === 'template' && !el.slotTarget) {
   
    return genChildren(el, state) || 'void 0'
  } else if (el.tag === 'slot') {
   
    return genSlot(el, state)
  } else {
   
    // component or element
    let code
    if (el.component) {
   
      code = genComponent(el.component, el, state)
    } else {
   
      const data = el.plain ? undefined : genData(el, state)

      const children = el.inlineTemplate ? null : genChildren(el, state, true)
      code = `_c('${
     el.tag}'${
             data ? `,${
       data}` : '' // data      }${
             children ? `,${
       children}` : '' // children      })
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值