Vu3 函数式API:方法函数 isRef()、unref()、toRef()、toValue()、toRefs()、isProxy()、isReactive()

Vu3 函数式API:方法函数 isRef()、unref()、toRef()、toValue()、toRefs()、isProxy()、isReactive()

isRef()

  • 查某个值是否为 ref。
import { ref, isRef } from 'vue';
<!-- 定义一个 ref 对象 -->
const count = ref(0);
console.log(isRef(count)); // 输出 true
<!-- 检查一个普通对象是否为 ref: -->
const normalObject = {};
console.log(isRef(normalObject)); // 输出 false

unref()

  • 如果参数是 ref,则返回内部值,否则返回参数本身。这是 val = isRef(val) ? val.value : val 计算的一个语法糖
import { ref, unref } from 'vue';

const count = ref(0);
console.log(unref(count)); // 输出 0

const normalValue = 10;
console.log(unref(normalValue)); // 输出 10

toRef()

  • 将一个对象的属性转换为 ref 对象,这样当这个 ref 对象的值变化时,原始对象的对应属性也会更新
import { reactive, toRef } from 'vue';

const state = reactive({ name: 'Alice', age: 25 });
const nameRef = toRef(state, 'name');

// 修改原对象属性会更新 ref
state.name = 'Bob';
console.log(nameRef.value); // 'Bob'

// 修改 ref 也会更新原对象
nameRef.value = 'Charlie';
console.log(state.name); // 'Charlie'

toValue()

  • 返回传入对象的值。如果传入的是 ref 对象,返回其内部的值;如果是响应式对象(reactive 创建的对象),返回其原始值
import { ref, toValue } from 'vue';

const numRef = ref(10);
const getter = () => 20;

console.log(toValue(numRef)); // 10
console.log(toValue(getter)); // 20
console.log(toValue(30)); // 30

const state = reactive({ count: 0 });
console.log(toValue(state)); // 输出 {count: 0}

toRefs()

  • 将一个响应式对象转换为一个普通对象,这个普通对象的每个属性都是指向源对象相应属性的 ref。每个单独的 ref 都是使用 toRef() 创建的。主要用于在模板中解构响应式对象时保持其响应性
import { reactive, toRefs } from 'vue';

const state = reactive({ x: 10, y: 20 });
const refs = toRefs(state);

// 解构后仍保持响应式
const { x, y } = refs;

// 修改原对象属性会更新 ref
state.x = 100;
console.log(x.value); // 100

// 修改 ref 也会更新原对象
y.value = 200;
console.log(state.y); // 200

isProxy()

  • 检查一个对象是否是由 reactive()、readonly()、shallowReactive() 或 shallowReadonly() 创建的代理
import { reactive, isProxy } from 'vue';

const obj = reactive({ foo: 'bar' });
console.log(isProxy(obj)); // true

const plainObj = { baz: 'qux' };
console.log(isProxy(plainObj)); // false

const ro = readonly({});
console.log(isProxy(ro)); // true

isReactive()

  • 检查一个对象是否是由 reactive() 或 shallowReactive() 创建的代理。
import { reactive, isReactive } from 'vue';
//reactive 创建的对象
const obj = reactive({ foo: 'bar' });
console.log(isReactive(obj)); // true

const plainObj = { baz: 'qux' };
console.log(isReactive(plainObj)); // false
// readonly 创建的对象
const state = readonly({ count: 0 });
console.log(isReactive(state)); // 输出 false

isReadonly()

  • 检查传入的值是否为只读对象。只读对象的属性可以更改,但他们不能通过传入的对象直接赋值。
  • 通过 readonly() 和 shallowReadonly() 创建的代理都是只读的,类似于没有 set 函数的 computed() ref。
import { readonly, reactive, isReadonly } from 'vue';
//readonly 创建的对象
const ro = readonly({});
//reactive 创建的对象
const state = reactive({});

console.log(isReadonly(ro)); // true
console.log(isReadonly(state)); // false

注意

  • toRef / toRefs​​: 在组合式函数中解构 reactive 对象时保持响应式。
  • unref​​: 简化对可能为 ref 值的处理(如函数参数可能是 ref 或普通值)。
  • toValue​​: 在组合式函数中统一处理 ref、getter 或普通值。
  • isProxy / isReactive / isReadonly​​: 开发工具或高级库中判断对象的响应式状态。-
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值