在Vue 3中,ref和reactive的区别,及typescript定义ref遇到vscode红线提示问题。

在Vue 3中,ref和reactive都用于创建响应式数据,但它们之间存在一些差异:

ref 用于为一个变量赋予响应式特性。你可以把 ref 看作可以存储一个值的“盒子”,你可以使用 value 属性直接访问或更改 ref 的值。当你在模板中使用 ref 时,不需要额外的 .value。

import { ref } from 'vue'
const count = ref(1)
console.log(count.value) // 1

reactive 用于创建一个响应式对象。reactive 必须输入一个对象,并将返回一个新的响应式对象。不过,这个新的对象仍然和传入 reactive 的原始对象具有相同的数据结构,当你改变新对象的值时,原对象也会做相应的改变。需要注意的是,由于 reactive 直接返回的是一个响应式对象,因此在模板中或是其它地方直接使用不需要 value。

import { reactive } from 'vue'
const state = reactive({ count: 1 })
console.log(state.count) // 1

回顾这两个方法,一个明显的主要差异是使用 ref 需要通过 .value 来访问或更改值,而 reactive 则不需要。
在实际的开发过程中,如果你要处理的是单个基本类型的数据,则可以直接使用 ref。然而,对于复杂数据类型,特别是对象,reactive 则可能是更好的选择,这是由于 reactive 能够更好地保留原始数据结构,而且能在必要时实现深度响应。如果你希望将对象解构或扩展到其它对象中,或将其返回给函数的调用者,那么 reactive 就可能会带来问题。此时,你可以使用 Vue 提供的 toRefs 或 shallowReactive,将 reactive 对象转化为多个 ref 对象,避免该问题。

TS定义时ide提示value不存在问题

首先, TypeScript 定义正确。如果 LoginForm 是 TypeScript 的类型或接口,应确保其属性包含 username 和 password:

interface LoginForm {
  username: string;
  password: string;
}

其次,在 Vue 3 中,使用 ref 定义的响应式数据在 TypeScript 中访问时需要添加 .value。这是在 Vue3 与 Typescript 结合使用时需要注意的细节,而在JavaScript中则没有这个问题。
当你使用 ref 定义 state 时:

const state: LoginForm = ref({
  username: "",
  password: "",
});

那么在访问 username 和 password 属性时,需要使用 state.value.username 和 state.value.password,包括在 userStore.login 函数调用中。VSCode 提示你错误是因为它在对 state 进行了类型推断,推断出 state 的类型是 LoginForm,而不是 Ref,这是 TypeScript 的类型系统与 Vue 的响应式系统之间的一种策略。
你可以通过如下方式修正:

const state = ref<LoginForm>({
  username: "",
  password: "",
});

// 访问 state 的属性时
userStore.login(state.value.username, state.value.password);
以上述方式声明并访问 ref 值既能保持 TypeScript 类型正确,也满足 Vue 的响应式要求,VSCode 也不会给出错误提示。
至于 ref 和 reactive 的选择,视具体情况而定。对于单一数据项,例如数字、字符串,ref 更方便;对于多属性对象,reactive 可以减少代码量,避免频繁使用 .value。

  • 32
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值