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

 更新时间:2022年06月27日 15:41:26   作者:wyc0859  
这篇文章主要为大家介绍了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<string>
const b = ref<string[]>([]) //可以通过范型显示约束 Ref<string[]>
const c: Ref<string[]> = ref([]) //声明类型 Ref<string[]> 
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<typPeople[]> = 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<string | number>('foo')
foo.value = 123
********* 如果ref类型未知,则建议将 ref 转换为 Ref<T>: *********
function useState<T>(initial: T) {
  const state = ref(initial) as Ref<T>
  return state
}
const item: typPeople = { name: 'aa', age: 18 }
const x1 = useState(item) // x1 类型为: Ref<typPeople>
const x2 = ref(item) //x2 类型为: Ref<{ name:string; age: number;}>
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指定类型实现示例的详细内容,更多关于vue3+ts实现ref及reactive指定类型的资料请关注脚本之家其它相关文章!

相关文章

  • 前端低代码form-generator实现及新增自定义组件详解

    前端低代码form-generator实现及新增自定义组件详解

    这篇文章主要给大家介绍了关于前端低代码form-generator实现及新增自定义组件的相关资料,form-generator是一个开源的表单生成器,可以帮助我们快速构建各种表单页面,需要的朋友可以参考下
    2023-11-11
  • element-ui 限制日期选择的方法(datepicker)

    element-ui 限制日期选择的方法(datepicker)

    本篇文章主要介绍了element-ui 限制日期选择的方法(datepicker),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • 如何用VUE和Canvas实现雷霆战机打字类小游戏

    如何用VUE和Canvas实现雷霆战机打字类小游戏

    这篇文章主要介绍了如何用VUE和Canvas实现雷霆战机打字类小游戏,麻雀虽小,五脏俱全,对游戏感兴趣的同学,可以参考下,研究里面的原理和实现方法
    2021-04-04
  • vue如何使用笛卡尔积算法构建sku表格

    vue如何使用笛卡尔积算法构建sku表格

    这篇文章主要介绍了vue如何使用笛卡尔积算法构建sku表格问题,具有很好的价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • vue实现文件上传和下载

    vue实现文件上传和下载

    这篇文章主要为大家详细介绍了vue实现文件上传和下载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Vue项目如何根据图片url获取file对象并用axios上传

    Vue项目如何根据图片url获取file对象并用axios上传

    这篇文章主要介绍了Vue项目如何根据图片url获取file对象并用axios上传问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Vue组件传值过程接收不成功的问题及解决

    Vue组件传值过程接收不成功的问题及解决

    这篇文章主要介绍了Vue组件传值过程接收不成功的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • Vue高级组件之函数式组件的使用场景与源码分析

    Vue高级组件之函数式组件的使用场景与源码分析

    Vue提供了一种称为函数式组件的组件类型,用来定义那些没有响应数据,也不需要有任何生命周期的场景,它只接受一些props来显示组件,下面这篇文章主要给大家介绍了关于Vue高级组件之函数式组件的使用场景与源码分析的相关资料,需要的朋友可以参考下
    2021-11-11
  • Vue3中多个弹窗同时出现的解决思路

    Vue3中多个弹窗同时出现的解决思路

    这篇文章主要介绍了Vue3中多个弹窗同时出现的解决思路,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • vue +elementui 项目登录通过不同账号切换侧边栏菜单的颜色

    vue +elementui 项目登录通过不同账号切换侧边栏菜单的颜色

    这篇文章主要介绍了vue +elementui 项目登录通过不同账号切换侧边栏菜单的颜色,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-01-01

最新评论