vue3 响应性API

本文详细介绍了Vue3中的响应式API,包括toRef、toRefs、unref、isRef、customRef、shallowRef、reactive、readonly、isReactive、toRaw、markRaw、shallowReactive、shallowReadonly、computed、effect与watchEffect、watch等,通过实例解析了这些API的用途和用法,帮助理解Vue3响应式编程。
摘要由CSDN通过智能技术生成

toRef

可以用来为源响应式对象上的 property 性创建一个 ref。然后可以将 ref 传递出去,从而保持对其源 property 的响应式连接。本质类似指针引用。
举例:

const state = reactive({
   
  foo: 1,
  bar: 2
})

const fooRef = toRef(state, 'foo')

fooRef.value++
console.log(state.foo) // 2

state.foo++
console.log(fooRef.value) // 3
export default {
   
  setup(props) {
   
    useSomeFeature(toRef(props, 'foo'))
  }
}

toRefs

将响应式对象转换为普通对象,其中结果对象的每个 property 都是指向原始对象相应 property 的ref。

例子如下:

const state = reactive({
   
  foo: 1,
  bar: 2
})

const stateAsRefs = toRefs(state)

其中的stateAsRefs变成这样
stateAsRefs:
{
foo: Ref<number>,
bar: Ref<number>
}

因为还是ref型式,依旧保持state与stateAsRefs 的响应式连接。
小技巧:

const obj = reactive({
    foo: 1 })
const obj2 = {
    foo: toRef(obj, 'foo') }
const obj2 = {
    ...toRefs(obj) } // 等同上面这句代码
//const obj2 = reactive({ ...toRefs(obj) })  // 让 obj2 也是 reactive,就可以不用.value

effect(() => {
   
  console.log(obj2.foo.value)  // 由于 obj2.foo 现在是一个 ref,因此要访问 .value
})

obj.foo = 2 // 有效

unref

如果参数为 ref,则返回内部值,否则返回参数本身。这就是 val = isRef(val) ? val.value : val简写。
用法:

function useFoo(x: number | Ref<number>) {
   
  const unwrapped = unref(x) // unwrapped 确保现在是数字类型
}

其实我就得ref这个东西还没设计好,为什么还要手动用一下.value取里面的值。就应该像Java的自动装箱与拆箱才对,个人这个unref用处不大。
而且现在最新有一个语法糖 :

ref: selectAddress = 0
ref: pay = computed(() => {
   
  return route.query.pay;
})

像这样定义后ref就不用再.value取值了


isRef

不用多说了,正如其名


customRef

创建一个自定义的 ref,并对其依赖项跟踪和更新触发进行显式控制。它需要一个工厂函数,该函数接收 track 和 trigger 函数作为参数,并应返回一个带有 get 和 set 的对象。
这段话难看懂,但是有例子之后就很好懂了:

<template>
<ul>
  <li v-for="ite
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值