这部分主要说两个方面,1是静态提升,2是事件监听缓存

静态提升意思就是说,在以往Vue执行函数的时候,无论是绑定数据的节点还是没有绑定的,都会在render函数执行的时候重新渲染,如下代码所示

import { createVNode as _createVNode, toDisplayString as _toDisplayString, openBlock as _openBlock, createBlock as _createBlock } from "vue"

export function render(_ctx, _cache, $props, $setup, $data, $options) {
return (_openBlock(), _createBlock("div", null, [
_createVNode("p", null, "HELLO WORLD"),
_createVNode("div", null, _toDisplayString(_ctx.msg), 1 /* TEXT */)
]))
}

 做了静态提升之后,

import { createVNode as _createVNode, toDisplayString as _toDisplayString, openBlock as _openBlock, createBlock as _createBlock } from "vue"

const _hoisted_1 = /*#__PURE__*/_createVNode("p", null, "HELLO WORLD", -1 /* HOISTED */)

export function render(_ctx, _cache, $props, $setup, $data, $options) {
return (_openBlock(), _createBlock("div", null, [
_hoisted_1,
_createVNode("div", null, _toDisplayString(_ctx.msg), 1 /* TEXT */)
]))
}

 静态的节点被提升到渲染函数外部,然后只会在首次的时候执行一下节点创建函数,以后每次渲染都拿外面的那个变量就完事了;

事件监听缓存

在以往的Vue版本中,事件是被当做一种动态属性来监听的,如下所示

import { createVNode as _createVNode, toDisplayString as _toDisplayString, openBlock as _openBlock, createBlock as _createBlock } from "vue"

const _hoisted_1 = /*#__PURE__*/_createVNode("p", null, "HELLO WORLD", -1 /* HOISTED */)

export function render(_ctx, _cache, $props, $setup, $data, $options) {
return (_openBlock(), _createBlock("div", null, [
_hoisted_1,
_createVNode("div", null, _toDisplayString(_ctx.msg), 1 /* TEXT */),
_createVNode("span", { onClick: _ctx.save }, null, 8 /* PROPS */, ["onClick"])
]))
}
_createVNode("span", { onClick: _ctx.save }, null, 8 /* PROPS */, ["onClick"]) 这部分就是绑定事件的节点,8代表动态属性,具体可参考上一篇;但是我们的事件监听函数,基本上是不会动态改变的;所以再进行监听是完全没有必要的,所以Vue3做了以下优化
import { createVNode as _createVNode, toDisplayString as _toDisplayString, openBlock as _openBlock, createBlock as _createBlock } from "vue"

const _hoisted_1 = /*#__PURE__*/_createVNode("p", null, "HELLO WORLD", -1 /* HOISTED */)

export function render(_ctx, _cache, $props, $setup, $data, $options) {
return (_openBlock(), _createBlock("div", null, [
_hoisted_1,
_createVNode("div", null, _toDisplayString(_ctx.msg), 1 /* TEXT */),
_createVNode("span", {
onClick: _cache[1] || (_cache[1] = (...args) => (_ctx.save && _ctx.save(...args)))
})
]))
}
onClick: _cache[1] || (_cache[1] = (...args) => (_ctx.save && _ctx.save(...args))) 由此可见,onClick:不再具有动态属性的标志,不是动态的,自然也不会生成监听了。效率自然也提高了;
 

Vue3比Vue2快的体现-第二部分的更多相关文章

  1. 想知道Vue3与Vue2的区别?五千字教程助你快速上手Vue3!

    从Vue3发布以来,我就一直对其非常感兴趣,就一直想着将其投入公司的生产中,但是开始考虑到很多不确定性就暂时对一些很小的功能进行一些尝试:慢慢的发现组合式Api的形式非常适合开发(个人感觉),尤其是V ...

  2. vue2升级vue3:vue2 vue-i18n 升级到vue3搭配VueI18n v9

    项目从vue2 升级vue3,VueI18n需要做适当的调整.主要是Vue I18n v8.x 到Vue I18n v9 or later 的变化,其中初始化: 具体可以参看:https://vue- ...

  3. vue3和vue2的区别

    一.Vue3介绍 Vue 新版本的理念成型于 2018 年末,当时 Vue 2 的代码库已经有两岁半了.比起通用软件的生命周期来这好像也没那么久,但在这段时期,前端世界已经今昔非比了 在更新(和重写) ...

  4. Vue3 相比 vue2

    Vue3 使用Proxy替代了defineProperty. Proxy 相比于 defineProperty 的优势 Object.defineProperty() 的问题主要有三个: 不能监听数组 ...

  5. vue3与vue2的区别

    全局属性 vue2 对于一些第三方插件,vue2中通常使用prototype原型来挂载到vue对象中 import Vue from 'vue' Vue.prototype.$http=Axiox V ...

  6. 第三十一篇:vue3和vue2的不同

    好家伙 1.为什么会有vue3? Vue2和Vue3的区别 - 简书 (jianshu.com) 貌似是因为他的对手太优秀,所以他也必须进步 2.什么是api? 从文件操作开始谈API. 以C语言为例 ...

  7. vue3和vue2 的区别,vue3和vu2到底哪个好呢?

    vue3 正式发布有两年多了,之前也做过一些学习和研究.vue3 发布后给某培训机构开发了一套vue3课程课件,自己也开源了一套基于vue3的后台管理系统(因为个人懒的原因,半年后才上传到gitHub ...

  8. 快学Scala 第二十二课 (apply和unapply)

    apply和unapply: apply方法经常用在伴生对象中,用来构造对象而不用显式地使用new. unapply是当做是伴生对象的apply方法的反向操作.apply方法接受构造参数,然后将他们变 ...

  9. 快学Scala 第二课 (apply, if表达式,循环,函数的带名参数,可变长参数,异常)

    apply方法是Scala中十分常见的方法,你可以把这种用法当做是()操作符的重载形式. 像以上这样伴生对象的apply方法是Scala中构建对象的常用手法,不再需要使用new. if 条件表达式的值 ...

  10. 快学Scala 第二十一课 (初始化trait的抽象字段)

    初始化trait的抽象字段: trait Logged { println("Logged constructor") def log(msg: String){ println( ...

随机推荐

  1. SpringMVC springmvc.xml配置路径前缀和后缀

    web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi=" ...

  2. Java智能之Spring AI:5分钟打造智能聊天模型的利器

    前言 尽管Python最近成为了编程语言的首选,但是Java在人工智能领域的地位同样不可撼动,得益于强大的Spring框架.随着人工智能技术的快速发展,我们正处于一个创新不断涌现的时代.从智能语音助手 ...

  3. java将list中某个元素放在首位

    java将list中某个元素放在首位 1 List<Example> example = exampleRepository.list(); 2 3 //将list里的某个字符串默认排列在 ...

  4. PixiJS源码分析系列: 第一章 从最简单的例子入手

    从最简单的例子入手分析 PixiJS 源码 我一般是以使用角度作为切入点查看分析源码,例子中用到什么类,什么方法,再入源码. 高屋建瓴的角度咱也做不到啊,毕竟水平有限 pixijs 的源码之前折腾了半 ...

  5. 存储系列DAS,SAN,NAS常见网络架构

    随着主机.磁盘.网络等技术的发展,对于承载大量数据存储的服务器来说,服务器内置存储空间,或者说内置磁盘往往不足以满足存储需要.因此,在内置存储之外,服务器需要采用外置存储的方式扩展存储空间,今天在这里 ...

  6. Django日期字段默认值default=timezone.now

    如果你确实希望默认值是当前日期和时间,Django 提供了一个方便的函数 django.utils.timezone.now 来实现这一目的. 你可以这样调整你的模型,以使用当前日期和时间作为默认值: ...

  7. [oeasy]python0135_python_语义分析_ast_抽象语法树_abstract_syntax_tree

    语义分析_抽象语法树_反汇编 回忆 上次回顾了一下历史 python 是如何从无到有的 看到 Guido 长期的坚持和努力   ​   添加图片注释,不超过 140 字(可选)   python究竟是 ...

  8. oeasy教您玩转vim - 76 - # Session会话

    ​ 会话session 回忆组合键映射的细节 上次我们定义了一系列的复合键 主要是和ctrl键一起 快速跳转window窗口 map <c-j> <c-w>j map < ...

  9. c++17

    std::variant<std::string,int,float>://作为联合体 using va = std::variant<std::string, int, float ...

  10. 03 OLED显示屏实现

    目录 前言 一.软件模拟IIC协议 1.开启IIC协议 2.结束IIC协议 3.传输数据 二.OLED的操作 1.传输数据的准备 2.写入命令 3.写入数据 4.初始化函数 5.设置光标 6.显示字符 ...