对于响应式工具toRef、toRefs等的理解

115 阅读2分钟

image.png

isRef

isRef(value)

- 作用:检查一个值是否为引用对象(ref对象)。

- 参数:

- value:要检查的值。

- 返回值:如果给定的值是引用对象,则返回true;否则返回false

unRef

unRef(value)

- 作用:解引用(解包),是 val = isRef(val) ? val.value : val 的一个语法糖

- 参数:

- value:要解引用的值。

- 返回值:如果给定的值是引用对象,则返回引用对象的值;否则返回该值本身。

toRef

toRef(object, key)

个人理解:将某个对象的单个属性转为一个ref,也可以基于响应式对象(reactive)上的一个属性创建一个对应的 ref

- 作用:将一个响应式对象或普通对象的属性转换为一个单独的引用(ref)

- 参数:

- object:要操作的响应式对象。

- key:要转换为引用对象的属性键。

- 返回值:一个引用对象,其值与原始对象的属性值相同,并与原始对象的属性保持响应式关联

- 适用场景

需要将某个 prop 传到一个外部函数中并保持响应性(isRef(props.xxx)==false),那么你可以使用 toRef() 这个工具函数

<script setup>
import { toRef } from 'vue'

const props = defineProps({
foo:{
  type:"string",
  default:""
    }
})

// 将 `props.foo` 转换为 ref,然后传入
// 一个组合式函数
useSomeFeature(toRef(props, 'foo'))
</script>

toRefs

toRefs(object)

个人理解:将某个对象的属性全部转为ref并放在一个新对象中,新对象是普通对象,这个普通对象的每个属性都是指向源对象相应属性的 ref

- 作用:将一个响应式对象(reactive)转换为一个由所有属性转换为引用对象(ref对象)组成的新对象。

- 参数:

- object:要转换的响应式对象(reactive)。

- 返回值:一个新的对象,其属性与原始对象的属性相同,但每个属性都是引用对象。

- 适用场景

需要解构 props 对象并保持响应性,那么你可以使用 toRefs() 这个工具函数

import { toRefs, toRef } from 'vue'

export default {
  setup(props) {
    // 将 `props` 转为一个其中全是 ref 的对象,然后解构
    const { title } = toRefs(props)
    // `title` 是一个追踪着 `props.title` 的 ref
    console.log(title.value)
  }
}

toValue

toValue(ref)

- 作用:获取引用对象(ref对象)的值。

- 参数:

- ref:要获取值的引用对象。

- 返回值:引用对象的值。

isProxy

isProxy(value)

- 作用:检查一个值是否是一个代理对象(Proxy对象)。

- 参数:

- value:要检查的值。

- 返回值:如果给定的值是代理对象,则返回true;否则返回false

isReactive

isReactive(value)

- 作用:检查一个值是否是一个响应式对象。

- 参数:

- value:要检查的值。

- 返回值:如果给定的值是响应式对象,则返回true;否则返回false

isReadonly

isReadonly(value)

- 作用:检查一个值是否是一个只读对象(readonly对象)。

- 参数:

- value:要检查的值。

- 返回值:如果给定的值是只读对象,则返回true;否则返回false