Reactive 和 Ref的基本使用 | 青训营笔记

132 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天

Reactive API

如果想为在setup中定义的数据提供响应式的特性,那么我们可以使用reactive函数 但是为什么可以实现响应式呢❓

  • 使用reactive函数处理我们的数据之后,数据再次被使用时就会进行依赖收集
  • 当数据发生改变时,所有收集到的依赖都是进行对应的响应式操作
  • in fact,data里的数据,也是在内部交给了reactive函数将其编程为响应式对象的

注:reactive函数的参数必须为对象 or 数组 如果我们传入一个基本数据类型(String、Number、Boolean)会报一个警告

Ref API

  • ref函数的参数类型无限制
  • ref 会返回一个可变的响应式对象,该对象作为一个 响应式的引用 维护着它内部的值
  • 它内部的值是在ref的 value 属性中被维护的
  • 在模板中引入ref的值时,Vue会自动帮助我们进行解包操作,并不需要在模板中通过 ref.value 的方式 来使用
  • 但是在 setup 函数内部,它依然是一个 ref引用, 所以对其进行操作时,我们依然需要使用 ref.value的方式

readonly

. 我们通过reactive或者ref可以获取到一个响应式的对象,但是某些情况下,我们传入给其他组件的这个响应式对象希望被使用,但是不能被修改,这个时候我们就可以使用readonly

. readonly会返回原生对象的只读代理(也就是它依然是一个Proxy,这是一个proxy的set方法被劫持,并且不能对其进行修改)

readonly的参数:

  • 普通对象
  • reactive对象
  • ref对象

注:1. readonly返回的对象都是不允许修改的

  1. 但是经过readonly处理的原来的对象是允许被修改的

  2. 本质上就是readonly返回的对象的setter方法被劫持了而已

Reactive判断的API

  • isProxy 检查对象是否是由 reactive 或 readonly创建的 proxy
  • isReactive 检查对象是否是由 reactive创建的响应式代理 , 如果该代理是 readonly 建的,但包裹了由 reactive 创建的另一个代理,它也会返回 true
  • isReadonly 检查对象是否是由 readonly 创建的只读代理。
  • toRaw 返回 reactive 或 readonly 代理的原始对象(不建议保留对原始对象的持久引用。请谨慎使用)
  • shallowReactive 创建一个响应式代理,它跟踪其自身 property 的响应性,但不执行嵌套对象的深层响应式转换 (深层还是原生对象)
  • shallowReadonly 创建一个 proxy,使其自身的 property 为只读,但不执行嵌套对象的深度只读转换(深层还是可读、可写的)

Ref的其他API

unref

  • 如果参数是一个 ref,则返回内部值,否则返回参数本身
  • 这是 val = isRef(val) ? val.value : val 的语法糖函数

isRef 判断值是否是一个ref对象

shallowRef 创建一个浅层的ref对象

triggerRef 手动触发和 shallowRef 相关联的副作用