VUE3效率的提升

静态提升

vue2中当我们写如下代码

<h1>hello</h1>

静态节点如下

render(){
    createVNode("h1",null,"Hello World")
}

Vue3中认为静态节点就不会改变了,没有必要放在渲染函数中,因为渲染函数在更改时会反复运行。如下只创建一次,之后在render函数中重复使用就可以了

const hoisted = createVNode("h1",null,"Hello World")
function render(){
   // 直接使用hoisted就行
}

静态属性提升

<div class = "user">
   {{user,name}}
</div>

静态属性提出来了,不用重复调用

const hoisted = {class:"user"}
function render(){
  createVNode("div",hoisted,user.name)
}

预字符串化

如下组件代码,我们可以发现静态代码很多,动态代码只有user.name

<div class="menu-bar">
   <div class="logo">
      <h1>logo</h1>
   </div>
   <ul class="nav">
      <li>menu</li>
      <li>menu</li>
      <li>menu</li>
      <li>menu</li>
   </ul>
   <div class="user">
       {{user.name}}
   </div>
</div>

Vue3会发现遇到了大量的连续的静态元素,编译器就会把静态元素编译成字符串大概如下

const _hoisted_2 = _createStaticVNode("<div class=\"logo\"><h1>logo</h1></div>......")

而Vue2会编译成大量的虚拟节点树,重新对比渲染的时候会全部对比,而Vue3只会对比动态的。

缓存事件处理函数

<a-button @click="count++"></a-button>

Vue2

render(ctx){
  return createVNode("button",{
       onClick:function($event){
          ctx.count++
     }
  })
}

Vue3

//_cache缓存对象,如果有缓存直接缓存,保证事件处理函数只生成一次
render(ctx,_cache){
  return createVNode("button",{
       onClick:cache[0] || (cache[0] = ($event) => (ctx.count++))
     }
  })
}

Block Tree

Vue2在对比新旧树的时候,并不知道哪些节点是静态的,哪些是动态的,只能一层一层比较,浪费了大量时间在对比静态节点上.Vue3利用编译器,把动态节点做标记只对比动态节点

PatchFlag

Vue2在对比每一个节点时,并不知道这个节点的哪些相关信息会发生变化,因此只能依次对比,对比属性有没有变化,内容有没有变化等等

Vue3中会记录一个动态节点哪里发生了变化,如果只有内容变化就只对比内容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值