《Vue进阶教程》第三十四课:toRefs的使用

打印 上一主题 下一主题

主题 1290|帖子 1290|积分 3870

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
 往期内容:

《Vue进阶教程》第二十三课:渲染计算属性的结果
《Vue进阶教程》第二十四课:优化
《Vue进阶教程》第二十五课:watch基本概念
《Vue进阶教程》第二十六课:实现侦听函数
《Vue进阶教程》第二十七课:实现侦听对象
《Vue进阶教程》第二十八课:实现新旧值
《Vue进阶教程》第二十九课:立即执行的回调
《Vue进阶教程》第三十课:watchEffect
《Vue进阶教程》第三十一课:ref的初步实现
《Vue进阶教程》第三十二课:ref响应丢失问题
《Vue进阶教程》第三十三课:toRef的使用
1) 基本使用

为了办理在赋值过程中响应丢失问题, Vue3提供了两个API


  • toRef: 办理赋值问题
  • toRefs: 办理展开, 解构问题
toRefs的使用
  1. <!DOCTYPE html>
  2. <html lang="en">
  3.   <head>
  4.     <meta charset="UTF-8" />
  5.     <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6.     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7.     <title>Document</title>
  8.     <script src="https://unpkg.com/vue@3.2.41/dist/vue.global.js"></script>
  9.   </head>
  10.   <body>
  11.     <script>
  12.       const { reactive, effect, toRef, toRefs } = Vue
  13.       // obj是reactive创建的响应式数据(proxy代理对象)
  14.       const obj = reactive({ foo: 1, bar: 2 })
  15.       // 使用toRefs解构赋值 取代 {foo, bar} = obj
  16.       const { foo, bar } = toRefs(obj)
  17.       effect(() => {
  18.         console.log('bar.value具有响应性', bar.value)
  19.       })
  20.     </script>
  21.   </body>
  22. </html>
复制代码
toRefs的实现

基本实现
  1. function toRefs(obj) {
  2.   const ret = {}
  3.   for (const key in obj) {
  4.     ret[key] = toRef(obj, key)
  5.   }
  6.   return ret
  7. }
复制代码
原码解读
1源码中对obj的类型做了判断
a如果不是reactive类型的对象, 提示警告
b支持代理是数组的情况
vue3.2.41源码- toRefs实现
  1. function toRefs(object) {
  2.   // 如果传入的对象不具备响应性, 提示警告
  3.   if (!isProxy(object)) {
  4.     console.warn(
  5.       `toRefs() expects a reactive object but received a plain one.`
  6.     )
  7.   }
  8.   // 支持代理是数组的情况
  9.   //   - 对象的情况: toRefs(reactive({foo: 1, bar: 2})) => {foo: ref(1), bar: ref(2)}
  10.   //   - 数组的情况: toRefs(reactive(['foo', 'bar'])) => [ref('foo'), ref('bar')]
  11.   const ret = isArray(object) ? new Array(object.length) : {}
  12.   for (const key in object) {
  13.     ret[key] = toRef(object, key)
  14.   }
  15.   return ret
  16. }
复制代码
测试用例
  1. <!DOCTYPE html>
  2. <html lang="en">
  3.   <head>
  4.     <meta charset="UTF-8" />
  5.     <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6.     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7.     <title>Document</title>
  8.     <script src="./reactive.js"></script>
  9.   </head>
  10.   <body>
  11.     <script>
  12.       // obj是响应式数据
  13.       const obj = reactive({ foo: 1, bar: 2 })
  14.       // 解构赋值
  15.       const { foo, bar } = toRefs(obj)
  16.       effect(() => {
  17.         console.log('foo.value具备响应性:', foo.value)
  18.       })
  19.     </script>
  20.   </body>
  21. </html>
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

梦应逍遥

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表