经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » React » 查看文章
vue3+ts中ref与reactive指定类型实现示例
来源:jb51  时间:2022/6/27 16:57:25  对本文有异议

ref 的基础特性

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

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

  1. const refa = ref(6)
  2. const rcta = reactive({ value: 12 })
  3. console.log('refa:', refa) //RefImpl{...}
  4. console.log('refa:', refa.value) //6
  5. console.log('rcta:', rcta) //Proxy {value: 12}
  6. console.log('rcta.value:', rcta.value) //12
  7. const refb = ref({ name: 'bbb' })
  8. console.log('refb:', refb.value, refb.value.name) //Proxy{name: 'bbb'} bbb
  9. //refb.value.age=18 //报错 //类型{ name: string;}上不存在属性age

如何在ref中指定类型

  1. const a = ref('') //根据输入参数推导字符串类型 Ref<string>
  2. const b = ref<string[]>([]) //可以通过范型显示约束 Ref<string[]>
  3. const c: Ref<string[]> = ref([]) //声明类型 Ref<string[]>
  4. const list = ref([1, 3, 5])
  5. console.log('list前:', list.value)
  6. list.value[1] = 7
  7. console.log('list后:', list.value)
  8. type typPeople = {
  9. name: string
  10. age: number
  11. }
  12. const list2: Ref<typPeople[]> = ref([])
  13. console.log('list2-前:', list2.value) //{} 不是空数组,而是空对象
  14. list2.value.push({ name: '小张', age: 18 })
  15. console.log('list2-后:', list2.value[0]) //{name: '小张', age: 18}
  16. ********* ref 内部值指定类型 *********
  17. const foo = ref<string | number>('foo')
  18. foo.value = 123
  19. ********* 如果ref类型未知,则建议将 ref 转换为 Ref<T>: *********
  20. function useState<T>(initial: T) {
  21. const state = ref(initial) as Ref<T>
  22. return state
  23. }
  24. const item: typPeople = { name: 'aa', age: 18 }
  25. const x1 = useState(item) // x1 类型为: Ref<typPeople>
  26. const x2 = ref(item) //x2 类型为: Ref<{ name:string; age: number;}>
  27. console.log('ref.value:', x1.value, x1.value.name)
  28. //Proxy{name: 'aa', age: 18} aa

reactive

返回对象的响应式副本

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

  1. const count = ref(1)
  2. console.log('ref:', count) //RefImpl{...}
  3. //当ref分配给reactive时,ref将自动解包
  4. const obj = reactive({ a: count }) //不需要count.value
  5. console.log(obj.a) // 1
  6. console.log(obj.a === count.value) // true
  7. //obj.b=7 //添加属性会报错 // { a: number; }上不存在属性b
  8. //const str=reactive("aaa") //这是报错的,reactive参数只能是对象
  9. const arr = reactive([1, 2]) //数组,其实结果还是对象
  10. const obj = reactive({ 0: 1, 1: 2 })
  11. console.log('arr', arr) //Proxy {0: 1, 1: 2}
  12. console.log('obj', obj) //Proxy {0: 1, 1: 2}
  13. //reactive定义和ref不同,ref返回的是Ref<T>类型,reactive不存在Reactive<T>
  14. //它返回是UnwrapNestedRefs<T>,和传入目标类型一致,所以不存在定义通用reactive类型
  15. function reactiveFun<T extends object>(target: T) {
  16. const state = reactive(target) as UnwrapNestedRefs<T>
  17. return state
  18. }
  19. type typPeople = {
  20. name: string
  21. age: number
  22. }
  23. const item: typPeople = { name: 'aa', age: 18 }
  24. const obj1 = reactive(item) //obj1 类型为: { name: string; age: number; }
  25. const obj2 = reactiveFun(item) //obj2 类型为: { name: string; age: number; }

isRef、isReactive

  1. // isRef 检查值是否为一个 ref 对象
  2. console.log('是否为ref:', isRef(count)) //true
  3. //isProxy 检查对象是否是 由reactive或readonly创建的 proxy
  4. //readonly是原始对象的只读代理
  5. console.log('ref是否为proxy:', isProxy(count)) //false
  6. console.log('reactive是否为proxy:', isProxy(obj)) //true
  7. //isReactive 检查对象是否是由 reactive 创建的响应式代理
  8. console.log('isReactive判断:', isReactive(obj)) //true

toRef、toRefs、toRaw

  • toRef 为源响应式对象上的某个元素 新创建一个 ref
  • toRefs 将响应式对象Proxy 转换为普通对象,且元素都指向原始对象的ref
  • toRaw 返回 reactive或readonly代理的原始对象

toRef 当你要将 prop 的 ref 传递给复合函数时,toRef 很有用

  1. const state = reactive({
  2. foo: 1,
  3. bar: 2
  4. })
  5. console.log(state.foo) //1
  6. state.foo++
  7. console.log(state.foo) //2
  8. const fooRef = toRef(state, 'foo')
  9. fooRef.value++
  10. console.log(state.foo) //3 但state.foo并没有.value属性,不要混淆

toRefs 将响应式对象Proxy转换为普通对象,且元素都指向原始对象的ref

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

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

以上就是vue3+ts中ref及reactive指定类型实现示例的详细内容,更多关于vue3+ts实现ref及reactive指定类型的资料请关注w3xue其它相关文章!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号