vue3响应式与组合式API

目录

一、引言:

二、组合式API       

setup

三、响应式

a. 原理对比 

b. vue3响应式API

1.ref 函数

2.reactive函数

3.toRef与toRefs函数

4.toRow与markRaw

5.readonly与shallowReadonly

6. 响应式数据的判断

 四、其他


一、引言:

vue3vue2到底更新了什么?

1. 性能提升:

  • 打包大小减少41%

  • 初次渲染快55%, 更新渲染快133%

  • 内存减少54%

2.  推荐Composition API

        简而言之,就是把同一个组件的数据和逻辑函数都放在一块(setup中)集中管理,不像vue2的options API 把各个不同的 function 分散写在统一的methods、watch和computed中,在需要修改的时候得上下横跳一一去找。

        使用Proxy代替defineProperty实现响应式;重写虚拟DOM的实现和Tree-Shaking

3. 开始支持 TS

4. 使用 vite 创建,优势在于:

  • 开发环境中,无需打包操作,可快速的冷启动。
  • 轻量快速的热重载(HMR)。
  • 真正的按需编译,不再等待整个应用编译完成。

 5. 移除部分方法:$on事件总线,.sync修饰符,过滤器filter等;生命周期钩子调整

二、组合式API       

setup

  • 理解:Vue3.0中一个新的配置项,值为一个函数。
  • setup是所有Composition API(组合API)“ 表演的舞台 ”
  • 组件中所用到的:数据方法等等,均要配置在setup中。
  • setup函数的两种返回值:
    1. 若返回一个对象,则对象中的属性、方法, 在模板中均可以直接使用。(重点)
    2. 若返回一个渲染函数:则可以自定义渲染内容。(了解)

注意点

  1. 尽量不要与Vue2.x配置混用
    • Vue2.x配置(data、methos、computed...)中可以访问到setup中的属性、方法。
    • 但在setup中不能访问到Vue2.x配置(data、methos、computed...)。
    • 如果有重名, setup优先。
  2. setup不能是一个async函数,因为返回值不再是对象, 而是promise, 模板看不到return对象中的属性。(后期也可以返回一个Promise实例,但需要Suspense和异步组件的配合)

三、响应式

a. 原理对比 

Vue2的响应式实现原理

  • 对象类型:通过Object.defineProperty()对属性的读取、修改进行拦截(数据劫持)。

  • 数组类型:通过重写更新数组的一系列方法来实现拦截。(对数组的变更方法进行了包裹)。

  • 存在问题

    • 新增属性、删除属性, 界面不会更新。
    • 直接通过下标修改数组, 界面不会自动更新。
  • 解决方案

    • 使用Vue.setVue.delete或者vm.$setvm.$delete这些API

Vue3的响应式实现原理

  • 通过 Proxy(代理): 拦截对象中任意属性的变化, 包括:属性值的读写、属性的添加、属性的删除等。
  • 通过Reflect(反射): 对源对象的属性进行操作。

b. vue3响应式API

1.ref 函数

  • 作用: 定义一个响应式的基本类型数据
  • 语法: const xxx = ref(initValue)
    • 创建一个包含响应式数据的引用对象(reference对象,简称ref对象)
    • JS中操作数据: xxx.value
    • 模板中读取数据: 不需要.value,直接:<div>{{xxx}}</div>
  • 备注:
    • 接收的数据可以是:基本类型、也可以是对象类型。
    • 基本类型的数据:响应式依靠的是类上的gettersetter完成的
    • 备注:ref也可以用来定义对象(或数组)类型数据, 它内部会自动通过reactive转为代理对象

2.reactive函数

  • 作用: 定义一个对象类型的响应式数据(基本类型不要用它,要用ref函数)
  • 语法:const 代理对象= reactive(源对象)接收一个对象(或数组),返回一个代理对象(Proxy的实例对象,简称proxy对象)
  • reactive定义的响应式数据默认(强制)深层次
  • 内部基于 ES6 的 Proxy 实现,通过代理对象操作源对象内部数据进行操作。

3.toRef与toRefs函数

  • 作用:创建一个 ref 对象,其value值指向另一个对象中的某个属性。

  • 语法:const name = toRef(person,'name')

  • 应用: 要将响应式对象中的某个属性单独提供给外部使用时。

  • toRefs:toRef功能一致,但可以批量创建多个 ref 对象,语法:toRefs(person)

4.toRow与markRaw

  • toRaw

    • 作用:将一个由reactive生成的响应式对象转为普通对象
    • 使用场景:用于读取响应式对象对应的普通对象,对这个普通对象的所有操作,不会引起页面更新。
  • markRaw

    • 作用:标记一个对象,使其永远不会再成为响应式对象。
    • 应用场景:
      1. 有些值不应被设置为响应式的,例如复杂的第三方类库等。
      2. 当渲染具有不可变数据源的大列表时,跳过响应式转换可以提高性能。

5.readonly与shallowReadonly

  • 应用场景: 不希望数据被修改时。
  • readonly: 让一个响应式数据变为只读的(深只读)。
  • shallowReadonly:让一个响应式数据变为只读的(浅只读)。

6. 响应式数据的判断

  • isRef: 检查一个值是否为一个 ref 对象
  • isReactive: 检查一个对象是否是由 reactive 创建的响应式代理
  • isReadonly: 检查一个对象是否是由 readonly 创建的只读代理
  • isProxy: 检查一个对象是否是由 reactive 或者 readonly 方法创建的代理

 四、其他

1. teleport

         一种将我们的组件html结构移动到指定位置的技术。

        允许我们控制在DOM中哪个父节点下渲染了HTML,而不必求助于全局状态或将其拆分为两个组件。

2. Fragment

        在Vue3中:组件可以没有根标签, 内部会将多个标签包含在一个Fragment虚拟元素中

        减少标签层级, 减小内存占用

3. Suspense

   等待异步组件时渲染一些g过渡内容(loading...),优化用户体验

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白目

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值