前言
前面给大家讲解了Vue3创建响应数据的API, 包括ref, reactive, readonly等. 以及computed(计算属性), watch(监听)等常用API的使用.
本章主要来介绍Vue3提供一些工具函数. 通过这些工具函数可以快速的帮我们去判断数据, 以及通过响应式数据获取非响应数据.
1. isRef()
isRef()
方法是Vue3
提供的工具函数, 用于检查某个值是否为 ref 类型的数据。通过前面的学习相信大家已经了解了, 通过ref()
, shallowRef()
, computed()
三个API返回的是ref
数据.
接下来我们先看一下isRef()
API 的具体类型. 通过示例理解isRef()
函数的使用.
类型:
通过isRef
类型, 可以看出以下几点信息:
● isRef
函数接受一个参数, 参数可以是任意数据类型
● isRef
函数返回一个布尔值, 如果参数是ref
类型的数据,则返回true
, 否则返回 false
示例代码:
请注意,返回值是一个类型判定 (type predicate)
,这意味着 isRef
可以被用作类型守卫
简单来说: 就是isRef()
函数返回一个布尔值. 判断参数是不是Ref
类型的数据, 根据这个结果进行判断处理后续代码逻辑
示例
当通过isRef
判断添加为true
时, 会判定msg
的类型是一个Ref<unknown>
类型, 因此在使用.value
属性时,ts
不会报错. 否则就不通过.value
获取数据
使用泛型
示例中没有使用泛型的isRef
判断条件中, 判定类型为Ref
,泛型为原有类型, 当使用.value
获取值时,就是unknown
类型, 因此调用toUpperCase
方法是报错
使用泛型后, 指定类型为string
类型, 则判定的为Ref<string>
类型, 使用.value
获取值时,值的类型为string
类型, 因此可以正常调用toUpperCase
方法
自定义泛型不会影响判断结果
2. unref()
unref
函数用于获取参数内部数据, 如果参数是ref数据(包括computed),则返回内部值, 即.value数据,否则返回参数本身。
unref
就是val = isRef(val) ? val.value : val
计算的一个语法糖。
类型
示例
示例说明:
参数count
是ref
类型, 则unref
函数返回count.value
属性值, 值为0
参数state
不是ref
类型, 因此返回参数本身, 即Proxy {a:true}
代理对象.
注意:
unref
方法泛型T
的类型,
- 如果参数为
Ref<T>
类型,T
是value
属性值的类型, 此类型也是unref
方法返回值的类型 - 如果参数是非
Ref
的对象类型, 这个对象只有一个属性值value
,T
也会获取到value
属性值的类型,注意此种情况可能会类型校验报错 - 除了以上情况,
T
则为参数类型
类型:
如果使用泛型, 参数则需要和指定的泛型类型保持一致
或者ref
类型的value
属性值类型与指定的泛型类型保持一致
str
本身为string
类型, str2
的value
值时string
类型
3. toRef()
- 基于响应式对象的一个 prop(属性)创建一个对应ref,且保持响应式
- 创建的 ref 与其源属性保持同步
示例:
4. toRefs()
toRefs
是一种用于破坏响应式对象并将其所有属性转换为 ref
的实用方法
- 将一个响应式对象转换为一个普通对象
- 对象的每个属性
(Prop)
都是对应的ref
,两者保持引用关系 - 每个单独的
ref
都是使用toRef()
创建的
类型:
示例:
5. toValue()
将值、refs
或 getters
规范化为值。这与 unref()
类似,不同的是此函数也会规范化 getter
函数。如果参数是一个 getter
,它将会被调用并且返回它的返回值。
类型:
根据类型,可知, toValue
函数接受的参数有三种形式:
- 传
入ref
数据. 返回ref
数据的.value
值 - 传入一个函数,
toValue
会自动调用这个函数, 返回函数的返回值 - 除了以上两种情况外, 传入声明值, 返回什么值
示例:
6. isProxy()
检查一个对象是否是由 reactive()
、readonly()
、shallowReactive()
或 shallowReadonly()
创建的代理。
类型:
示例:
7. isReactive()
检查一个对象是否是由 reactive()
或 shallowReactive()
创建的代理。
类型:
示例:
8. isReadonly()
检查传入的值是否为只读对象。
通过 readonly()
和 shallowReadonly()
创建的代理都是只读的,因为他们是没有 set
函数的 computed()
ref
。
类型:
示例: