阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

vue3+ts中ref与reactive指定类型实现示例详解

325次阅读
没有评论

共计 3334 个字符,预计需要花费 9 分钟才能阅读完成。

导读 这篇文章主要为大家介绍了 vue3+ts 中 ref 及 reactive 如何指定类型的实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
ref 的基础特性

ref 约等于 reactive({value: x})

ref() 可以定义时无参数,第一次赋值任意类型,然后就不能增加属性

const refa = ref(6)
const rcta = reactive({value: 12})
console.log('refa:', refa) //RefImpl{...}
console.log('refa:', refa.value) //6
console.log('rcta:', rcta) //Proxy {value: 12}
console.log('rcta.value:', rcta.value) //12
const refb = ref({name: 'bbb'})
console.log('refb:', refb.value, refb.value.name) //Proxy{name: 'bbb'}   bbb
//refb.value.age=18 // 报错 // 类型 {name: string;} 上不存在属性 age
如何在 ref 中指定类型
const a = ref('') // 根据输入参数推导字符串类型 Ref
const b = ref([]) // 可以通过范型显示约束 Ref
const c: Ref = ref([]) // 声明类型 Ref 
const list = ref([1, 3, 5])
console.log('list 前:', list.value)
list.value[1] = 7
console.log('list 后:', list.value)
type typPeople = {
  name: string
  age: number
}
const list2: Ref = ref([])
console.log('list2- 前:', list2.value) //{} 不是空数组,而是空对象
list2.value.push({name: '小张', age: 18})
console.log('list2- 后:', list2.value[0]) //{name: '小张', age: 18}
********* ref 内部值指定类型 *********
const foo = ref('foo')
foo.value = 123
********* 如果 ref 类型未知,则建议将 ref 转换为 Ref:*********
function useState(initial: T) {const state = ref(initial) as Ref
  return state
}
const item: typPeople = {name: 'aa', age: 18}
const x1 = useState(item) // x1 类型为: Ref
const x2 = ref(item) //x2 类型为: Ref
console.log('ref.value:', x1.value, x1.value.name) 
//Proxy{name: 'aa', age: 18}  aa
reactive

返回对象的响应式副本

reactive(x) 必须要指定参数,所以类型就已经确定了,也不能增加属性

const count = ref(1)
console.log('ref:', count) //RefImpl{...}
// 当 ref 分配给 reactive 时,ref 将自动解包
const obj = reactive({a: count}) // 不需要 count.value
console.log(obj.a) // 1
console.log(obj.a === count.value) // true
//obj.b=7 // 添加属性会报错 // {a: number;}上不存在属性 b
//const str=reactive("aaa")   // 这是报错的,reactive 参数只能是对象
const arr = reactive([1, 2]) // 数组,其实结果还是对象
const obj = reactive({0: 1, 1: 2})
console.log('arr', arr) //Proxy {0: 1, 1: 2}
console.log('obj', obj) //Proxy {0: 1, 1: 2}
//reactive 定义和 ref 不同,ref 返回的是 Ref<T> 类型,reactive 不存在 Reactive<T>
// 它返回是 UnwrapNestedRefs<T>,和传入目标类型一致,所以不存在定义通用 reactive 类型
function reactiveFun<T extends object>(target: T) {const state = reactive(target) as UnwrapNestedRefs<T>
  return state
}
type typPeople = {
  name: string
  age: number
}
const item: typPeople = {name: 'aa', age: 18}
const obj1 = reactive(item) //obj1 类型为: {name: string; age: number;}
const obj2 = reactiveFun(item) //obj2 类型为: {name: string; age: number;}
isRef、isReactive
// isRef 检查值是否为一个 ref 对象
console.log('是否为 ref:', isRef(count)) //true
//isProxy 检查对象是否是 由 reactive 或 readonly 创建的 proxy
//readonly 是原始对象的只读代理
console.log('ref 是否为 proxy:', isProxy(count)) //false
console.log('reactive 是否为 proxy:', isProxy(obj)) //true
//isReactive 检查对象是否是由 reactive 创建的响应式代理
console.log('isReactive 判断:', isReactive(obj)) //true
toRef、toRefs、toRaw
  • toRef 为源响应式对象上的某个元素 新创建一个 ref
  • toRefs 将响应式对象 Proxy 转换为普通对象,且元素都指向原始对象的 ref
  • toRaw 返回 reactive 或 readonly 代理的原始对象
  • toRef 当你要将 prop 的 ref 传递给复合函数时,toRef 很有用

    const state = reactive({
      foo: 1,
      bar: 2
    })
    console.log(state.foo) //1
    state.foo++
    console.log(state.foo) //2
    const fooRef = toRef(state, 'foo')
    fooRef.value++
    console.log(state.foo) //3  但 state.foo 并没有.value 属性,不要混淆
    toRefs 将响应式对象 Proxy 转换为普通对象,且元素都指向原始对象的 ref

    toRaw 返回 reactive 或 readonly 代理的原始对象,当然也可以返回 ref 的原始对象

    const state = reactive({
      foo: 1,
      bar: 2
    })
    console.log(state) //Proxy {foo: 1, bar: 2}
    const refs1 = toRefs(state) //toRefs 将响应式对象 Proxy 转换为普通对象
    console.log('toRefs:', refs1) //{foo: ObjectRefImpl, bar: ObjectRefImpl}
    const refs2 = toRaw(state) //toRaw 返回 reactive 或 readonly 代理的原始对象
    console.log('toRaw:', refs2) //{foo: 1, bar: 2}
    const ref1 = ref(5) //ref 并不是 Proxy, 而是 RefImpl
    const refs3 = toRefs(ref1) // 不报错,但没意义

    以上就是 vue3+ts 中 ref 及 reactive 指定类型实现示例的详细内容.

    阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

    腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

    代金券:在阿里云专用满减优惠券

    正文完
    星哥玩云-微信公众号
    post-qrcode
     0
    星锅
    版权声明:本站原创文章,由 星锅 于2024-07-25发表,共计3334字。
    转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
    【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
    阿里云-最新活动爆款每日限量供应
    评论(没有评论)
    验证码
    【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

    星哥玩云

    星哥玩云
    星哥玩云
    分享互联网知识
    用户数
    4
    文章数
    19351
    评论数
    4
    阅读量
    7983432
    文章搜索
    热门文章
    星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

    星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

    星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
    星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

    星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

    星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
    我把用了20年的360安全卫士卸载了

    我把用了20年的360安全卫士卸载了

    我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
    再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

    再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

    再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
    飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

    飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

    飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
    阿里云CDN
    阿里云CDN-提高用户访问的响应速度和成功率
    随机文章
    你的云服务器到底有多强?宝塔跑分告诉你

    你的云服务器到底有多强?宝塔跑分告诉你

    你的云服务器到底有多强?宝塔跑分告诉你 为什么要用宝塔跑分? 宝塔跑分其实就是对 CPU、内存、磁盘、IO 做...
    星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

    星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

      星哥带你玩飞牛 NAS-16:飞牛云 NAS 换桌面,fndesk 图标管理神器上线! 引言 哈...
    星哥带你玩飞牛NAS-7:手把手教你免费内网穿透-Cloudflare tunnel

    星哥带你玩飞牛NAS-7:手把手教你免费内网穿透-Cloudflare tunnel

    星哥带你玩飞牛 NAS-7:手把手教你免费内网穿透 -Cloudflare tunnel 前言 大家好,我是星...
    把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地

    把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地

    把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地 大家好,我是星哥,今天教大家在飞牛 NA...
    星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

    星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

    星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...

    免费图片视频管理工具让灵感库告别混乱

    一言一句话
    -「
    手气不错
    开源MoneyPrinterTurbo 利用AI大模型,一键生成高清短视频!

    开源MoneyPrinterTurbo 利用AI大模型,一键生成高清短视频!

      开源 MoneyPrinterTurbo 利用 AI 大模型,一键生成高清短视频! 在短视频内容...
    手把手教你,购买云服务器并且安装宝塔面板

    手把手教你,购买云服务器并且安装宝塔面板

    手把手教你,购买云服务器并且安装宝塔面板 前言 大家好,我是星哥。星哥发现很多新手刚接触服务器时,都会被“选购...
    零成本上线!用 Hugging Face免费服务器+Docker 快速部署HertzBeat 监控平台

    零成本上线!用 Hugging Face免费服务器+Docker 快速部署HertzBeat 监控平台

    零成本上线!用 Hugging Face 免费服务器 +Docker 快速部署 HertzBeat 监控平台 ...
    一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸

    一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸

    一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸 前言 作为天天跟架构图、拓扑图死磕的...
    国产开源公众号AI知识库 Agent:突破未认证号限制,一键搞定自动回复,重构运营效率

    国产开源公众号AI知识库 Agent:突破未认证号限制,一键搞定自动回复,重构运营效率

    国产开源公众号 AI 知识库 Agent:突破未认证号限制,一键搞定自动回复,重构运营效率 大家好,我是星哥,...