Vue3.0上手

172 阅读3分钟

一、Vue3简介

二、Vue3带来了什么

1、性能提升

  • 打包减少了40%
  • 初次渲染快55%,更新快133%
  • 内存减少54% ......

2、源码升级

  • 使用proxy代替obj.defineproperty实现下响应式
  • 重写虚拟DOM的实现和Tree-shaking ......

3、拥抱TS

  • Vue3更好地支持TypeScript

4、新的特性

1.Composition API(组合API)

  • setup
  • ref与reactive
  • watch与watchEffect
  • provide与inject

...

2.新的内置组件

  • Fragment
  • Teleport
  • Suspense

3.其他改变

  • 新的生命周期钩子
  • data选项应始终被声明为一个函数
  • 移除keyCode作为v-on修饰符 ...

三、创建Vue3.0工程

四、常用Composition API

1. setup

2. setup的两个注意点

  • setup的执行时机 在beforeCreate之前执行一次,this是undefined。

  • setup的参数

    • props:值为对象,包含组件外部传递过来,且组件内部中接收的属性。

    • context:上下文对象

      • attrs:值为对象,包含:组件外部传递过来,但没有在props配置中声明的属性,相当于this,$attrs.
      • slots:收到的插槽内容.
      • emit:分发自定义事件的函数.

3. ref函数

  • 作用:定义一个响应式数据

  • 语法:

    const xxx = ref(初始值)
    ​
    //比如:
    const a = ref('A')
    const b = ref(null)
    const c = ref(1)
    

    (1)创建一个包含响应式数据的引用对象(reference对象,简称ref对象)

    (2)JS中操作数据:xxx.value

    (3)template中读取数据:不需要.value,直接{{xxx}即可

  • 备注:

    • 接受的数据可以使:基本类型、也可以是对象类型
    • 基本类型的数据:响应式依然是靠object.defineProperty()的get与set完成。
    • 对象类型的数据:内部“求助”了vue3的一个新函数--reactive函数

4. reactive函数

  • 作用:定义一个对象类型的响应式数据(基本类型不要用它,定义基本类型要用ref函数)

  • 语法:

    const 代理对象= reactive(源对象),接收一个对象或数组,返回一个代理对象(Proxy的实例对象,简称proxy对象)
    ​
    //比如
    const obj = reactive({
        a:1
    })
    
  • reactive的响应式是深层次的。

  • 内部基于ES6的Proxy实现,通过代理对象操作源对象内部数据进行操作。

5. reactive对比ref

  • 从定义数据角度对比:

    • ref用来定义:基本类型数据
    • reactive用来定义:对象(或数组)类型数据
    • 备注:ref也可以用来定义对象(或数据)类型数据,它内部会自动通过reactice转为代理对象
  • 从原理角度对比:

    • ref通过object.defineProperty的get与set来实现响应式(数据劫持)。
    • reactive通过使用Proxy来实现响应式(数据劫持),并通过Reflect操作原对象内部的数据
  • 从使用角度对比:

    • ref定义的数据:操作数据需要.value,读取数据时模板不需要.value。
    • reactive定义的数据:操作数据和模板数据读取,均不需要.value。

6. vue3中的响应式原理

  • 响应式的原理是什么

    Vue用过三种响应式解决方案:defineProperty、Proxy、value setter。

    img

    结合一个例子来说明这几种的区别:

  • Vue3响应式的实现原理:

    • 基于Proxy实现真正的拦截(代理):拦截对象中任意属性的变化。包括:属性值的读写、添加、删除等。

      (Proxy 是针对对象来监听,而不是针对某个具体属性,所以不仅可以代理那些定义时不存在的属性,还可以代理更丰富的数据结构,比如 Map、Set 等,并且我们也能通过 deleteProperty 实现对删除操作的代理.)

    • 通过Reflect(反射):对源代码属性进行操作

7. 计算属性与原理

8. 生命周期

9. 自定义hook函数

10. toRef

五、其他Composition API

六、Composition API的优势

七、新的组件

八、其他