Vue2到Vue3的历程

112 阅读2分钟

介绍一下vue

Vue就是渐进式框架,与其他框架不同的是,Vue的核心就是只关注图层,容易上手,自低向上逐层应用,他是属于MVVM(model-View-ViewModel)架构

  • View-视图层(UI用户界面)
  • ViewModel-业务逻辑(一切js可视为业务逻辑)
  • Model-数据层(储存数据以及对数据都处理如增删改查)

我们可以把ViewModel看做是一个桥梁,当View视图发生改变的时候,就会通知ViewModel这个桥梁,Model-数据层就会去更新我们想要的数据;当然 Model-数据层的数据发生改变,也会去通知ViewModel的这个桥梁去更新view的视图,所以他们是永远保持这个同步的,只需要关注这个视图层即可,就就是MVVM架构的运行过程。

Vue2和Vue3的区别

  • Vue2是使用这种options API的形式去构建的
  • Vue3是使用这种competiton API的形式去构建的(组合式)
//Vue2
<script>
    export default {
        data() {
            return {

            }
        },
        methods: {
        
        },
        watch: {
        
        },
        components {
        
        },
        filters: {
        
        },
        procide: {
        
        }
    }
</script>
//Vue3
<script setup lang="ts">
    import { ref, reactive, onMounted, watch, computed } from "vue";
    const name = ref<string>("小石");
    watch(name, () => {
        name + 'watch'
    })
    computed(() => {
        return name + 'computed'
    })
    onMounted(() => {
        name.value = 'onMounted'
    })
</script>

通过对比发现,Vue2的options api写的是比较分散的,首先得在data里面定义数据,然后在methods去使用,有在watch里面用,比较分散的;而Vue3的competiton的api可以把这些逻辑写到一块,也还可以封装成一个hook,写起来是非常分明的。

Vue3的新特性介绍

  • 重写双向数据绑定
  • VDOM性能瓶颈
  • Fragments
  • Tree-Shaking的支持
  • Composition API

这里就重点说一下 重写双向数据绑定

我们知道Vue2是基于object.defineProperty()来实现的,Vue3是基于Proxy()来实现的,Proxy与object.defineProperty(obj, prop, desc)方式有以下优势

  1. 丢掉麻烦的备份数据
  2. 省去for in循环
  3. 可以监听数组的变化
  4. 代码更加的简化
  5. 可以监听动态新增的属性
  6. 可以监听删除的属性
  7. 可以监听数组的索引和length属性

通过看Vue2的源码得知,他的响应式原理是通过object.defineProperty通过get(),set()去做一个数据劫持,他处理数组的方法是重写这些数组的原型方法,都可以被监听到的

Vue3是通过Proxy做的代理,因为object.defineProperty是数组处理的不太友好,也监听不到数组长度的变化