VUE2.0和VUE3.0的区别

数据的双向绑定的原理

重构响应式系统,使用Proxy替换Object.defineProperty

Object.defineProperty的原理:通过使用 Object.defineProperty 来劫持对象属性的 geter 和 seter 操作,当数据发生改变发出通知。Vue2.x版本中的双向绑定不能检测到下标的变化。

<script>

    var obj = {};

    Object.defineProperty(obj, 'prop', {

      get: function () {

            return val;

        },

        set: function (newVal) {

          val = newVal;

            document.getElementById('text').innerHTML = val;

        }

    });

    document.addEventListener('keyup', function (e) {

        obj.prop = e.target.value;

    });

</script>

porxy原理:通过ES6的新特性proxy来劫持数据,当数据改变时发出通知。proxy可以劫持整个对象,并返回一个新对象。

<script>

  var obj = {};

  var obj1 = new Proxy(obj, {

      // target就是第一个参数obj, receive就是返回的obj(返回的proxy对象)

      get: function (target, key, receive) {

        // 返回该属性值

          return target[key];

      },

      set: function (target, key, newVal, receive) {

            // 执行赋值操作

            target[key] = newVal;

          document.getElementById('text').innerHTML = target[key];

      }

    })

    document.addEventListener('keyup', function (e) {

        obj1[0] = e.target.value;

    });

</script>

性能的提升

diff方法优化

Vue2 中的虚拟dom是进行全量的杜比

Vue3 新增了静态标记(PatchFlag),只比对带有 PF 的节点,并且通过 Flag 的信息得知

当前节点要比对的具体内容。

静态提升

Vue2中无论元素是否参与更新, 每次都会重新创建, 然后再渲染

Vue3中对于不参与更新的元素, 会做静态提升, 只会被创建一次, 在渲染时直接复用即可

cacheHandlers 事件侦听器缓存

Vue2默认情况下onClick会被视为动态绑定, 所以每次都会去追踪它的变化

Vue3但是因为是同一个函数,所以没有追踪变化, 直接缓存起来复用即可

ssr渲染

Vue2当有大量静态的内容时候,这些内容会被当做纯字符串推进一个buffer里面, 即使存在动态的绑定,会通过模板插值嵌入进去。这样会比通过虚拟dmo来渲染的快上很多很多。

Vue3当静态内容大到一定量级时候,会用_createStaticVNode方法在客户端去生成一个static node,这些静态node,会被直接innerHtml,就不需要创建对象,然后根据对象渲染。

按需编译,体积更小(Tree shaking)

Tree-shaking 使编译更友好,比如,如果你的项目没有用到watch,那编译时就会把tree shaking掉。

Compostion API: 组合API/注入API

Vue2的组件内,使用的是Option API风格(data/methods/mounted)来组织的代码,这样会让逻辑分散,举个例子就是我们完成一个计数器功能,要在data里声明变量,在methods定义响应函数,在mounted里初始化变量,如果在一个功能比较多、代码量比较大的组件里,你要维护这样一个功能,就需要在data/methods/mounted反复的切换到对应位置,然后进行代码的更改。

Vue3中,使用setup函数。如下所示跟count相关的逻辑,都放到counter.js文件里,跟todo相关的逻辑放到todos.js里。

import useCounter from './counter'

import useTodo from './todos'

setup(){

  let { val, todos, addTodo } = useTodo()

  let {count,add} = useCounter()

  return {

    val, todos, addTodo,

    count,add,

  }

}

自定义渲染API(Custom Renderer API)

Vue2.x最开始支持运行在浏览器中,渲染到浏览器的dom上,随着vue的流行,出现了weex和myvue。

Vue2.x项目架构对于这种渲染到不同平台不太友好,

Vue3.0推出了自定义渲染API解决了该问题。

下面我们先看vue2和vue3的入口写法有所不同:

// vue2

import Vue from 'vue'

import App from './App.vue'

new Vue({ => h(App)}).$mount('#app')

// vue3

const { createApp }  from 'vue'

import App from "./src/App"

createApp(App).mount(('#app')9

vue官方实现的 createApp 会给我们的 template 映射生成 html 代码,但是要是你不想渲染生成到 html ,而是要渲染生成到 canvas 之类的不是html的代码的时候,那就需要用到 Custom Renderer API 来定义自己的 render 渲染生成函数了。

// 你自己实现一个createApp,比如是渲染到canvas的。

import { createApp } from "./runtime-render";

import App from "./src/App"; // 根组件

createApp(App).mount('#app');

vite开发构建工具

Vue2是使用webpack作为开发构建工具的,npm run dev都要等一会,项目越大等的时间越长

Vue3是使用vite来做开发构建工具。vite支持浏览器支持import关键字,启动项目时浏览器直接请求路由对应的代码文件,代理服务器针对单个文件进行编译并返回。如果请求的文件里还import了其他文件,同理浏览器继续发请求,代理服务器返回。就这样实现了npm run dev时无需编译,实时请求实时编译。

支持TS语法

Vue2结合ts的具体实践中,要用 vue-class-component 强化 vue 组件,让 Script 支持 TypeScript 装饰器,用 vue-property-decorator 来增加更多结合 Vue 特性的装饰器,最终搞的ts的组件写法和js的组件写法差别挺大。

Vue3量身打造了defineComponent函数,使组件在ts下,更好的利用参数类型推断 。Composition API 代码风格中,比较有代表性的api就是 ref 和 reactive,也很好的支持了类型声明。

import { defineComponent, ref } from 'vue'

const Component = defineComponent({

    props: {

        success: { type: String },

        student: {

          type: Object as PropType<Student>,

          required: true

      }

    },

    setup() {

      const year = ref(2020)

      const month = ref<string | number>('9')


      month.value = 9 // OK

    const result = year.value.split('') // => Property 'split' does not exist on type 'number'

原文链接:https://blog.csdn.net/qq_42883190/article/details/123526556

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容