说说 vue1、vue2 和 vue3 的区别

面试时被问到,那就趁机梳理一下 vue 的演进吧

vue2 比 vue1 的改进

详见从Vue 1.x 迁移

生命周期

比如说 beforeCompile 移除, 使用 created 替代,compiled 移除,使用 mounted 替换等

语法

新数组语法 (value, index) in arr,并丢弃 $index 和 $key

过滤器废弃,不再这样写 <p v-for="item in items | limitBy 10">{{ item }}</p>,改而在方法里自己做好分割

围绕 DOM 的实例方法移除,比如说 vm.$appendTo 移除

单向数据流思想引入

v-model 变为语法糖,本质上变成了 emit 了一个 input 事件,并且在本组件内触发它的更新。

$dispatch 和 $broadcast 废弃

引入 vdom 虚拟节点

解偶 HTML 依赖,从此可以渲染到 DOM 意外的平台上,比如说 SSR。

vue3 比 vue2 的改进

vue 3 源码:https://github.com/vuejs/vue-next

使用了 proxy 替代 Object.defineProperty

目前,Vue 的反应系统是使用 Object.defineProperty 的 getter 和 setter。 但是,Vue 3 将使用 ES2015 Proxy 作为其观察者机制。 这消除了以前存在的警告,使速度加倍,并节省了一半的内存开销。

为了继续支持 IE11,Vue 3 将发布一个支持旧观察者机制和新 Proxy 版本的构建

而为什么使用 Proxy 替代 Object.defineProperty?Proxy 可以劫持整个对象,并返回一个新的对象。Proxy 不仅可以代理对象,还可以代理数组,还可以代理动态增加的属性。节省内存,速度加倍。关于 Proxy API 参见 MDN

新增 hook api

注意 setup

<template>
  <div>
    <span>count is {{ count }}</span>
    <span>plusOne is {{ plusOne }}</span>
    <button @click="increment">count++</button>
  </div>
</template>

<script>
import { value, computed, watch, onMounted } from 'vue'

export default {
  setup() {
    // reactive state
    const count = value(0)
    // computed state
    const plusOne = computed(() => count.value + 1)
    // method
    const increment = () => { count.value++ }
    // watch
    watch(() => count.value * 2, val => {
      console.log(`count * 2 is ${val}`)
    })
    // lifecycle
    onMounted(() => {
      console.log(`mounted`)
    })
    // expose bindings on render context
    return {
      count,
      plusOne,
      increment
    }
  }
}
</script>

让vue更快的优化

像是重写虚拟DOM,优化插槽生成,静态树提升,静态属性提升,详见 Vue.js 3.0 新特性预览

让vue更小

tree shaking做的更好。新的 vue 核心运行时压缩后大概 10kb

其他支持

更好的ts支持等。

总结

从用 vue 1.x 开始到现在 vue 3.x 登场,中间过去 4 年了吧,不知不觉 vue 都做了如此多的改进,若不是查了下资料我甚至都想不起来 vue 的 vdom 是在 vue 2.x 时引入的。

参考

从Vue 1.x 迁移

Vue.js 3.0 新特性预览

MDN Proxy

精读《Vue3.0 Function API》

猜你喜欢

转载自www.cnblogs.com/everlose/p/12564343.html