当前位置: 首页 > article >正文

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

 往期内容:

《Vue进阶教程》第二十三课:渲染计算属性的结果

《Vue进阶教程》第二十四课:优化

《Vue进阶教程》第二十五课:watch基本概念

《Vue进阶教程》第二十六课:实现侦听函数

《Vue进阶教程》第二十七课:实现侦听对象

《Vue进阶教程》第二十八课:实现新旧值

《Vue进阶教程》第二十九课:立即执行的回调

《Vue进阶教程》第三十课:watchEffect

《Vue进阶教程》第三十一课:ref的初步实现

《Vue进阶教程》第三十二课:ref响应丢失问题

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

1) 基本使用

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

  • toRef: 解决赋值问题
  • toRefs: 解决展开, 解构问题

toRefs的使用

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script src="https://unpkg.com/vue@3.2.41/dist/vue.global.js"></script>
  </head>
  <body>
    <script>
      const { reactive, effect, toRef, toRefs } = Vue
      // obj是reactive创建的响应式数据(proxy代理对象)
      const obj = reactive({ foo: 1, bar: 2 })

      // 使用toRefs解构赋值 取代 {foo, bar} = obj
      const { foo, bar } = toRefs(obj)
      effect(() => {
        console.log('bar.value具有响应性', bar.value)
      })
    </script>
  </body>
</html>

toRefs的实现

基本实现

function toRefs(obj) {
  const ret = {}
  for (const key in obj) {
    ret[key] = toRef(obj, key)
  }
  return ret
}

原码解读
1源码中对obj的类型做了判断
a如果不是reactive类型的对象, 提示警告
b支持代理是数组的情况

vue3.2.41源码- toRefs实现

function toRefs(object) {
  // 如果传入的对象不具备响应性, 提示警告
  if (!isProxy(object)) {
    console.warn(
      `toRefs() expects a reactive object but received a plain one.`
    )
  }
  // 支持代理是数组的情况
  //   - 对象的情况: toRefs(reactive({foo: 1, bar: 2})) => {foo: ref(1), bar: ref(2)}
  //   - 数组的情况: toRefs(reactive(['foo', 'bar'])) => [ref('foo'), ref('bar')]
  const ret = isArray(object) ? new Array(object.length) : {}
  for (const key in object) {
    ret[key] = toRef(object, key)
  }
  return ret
}

测试用例

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script src="./reactive.js"></script>
  </head>
  <body>
    <script>
      // obj是响应式数据
      const obj = reactive({ foo: 1, bar: 2 })

      // 解构赋值
      const { foo, bar } = toRefs(obj)

      effect(() => {
        console.log('foo.value具备响应性:', foo.value)
      })
    </script>
  </body>
</html>


http://www.kler.cn/a/469165.html

相关文章:

  • 源代码编译安装X11及相关库、vim,配置vim(3)
  • ubuntu开机启动服务
  • 基于Matlab的变压器仿真模型建模方法(13):单相升压自耦变压器的等效电路和仿真模型
  • Flutter 鸿蒙化 flutter和鸿蒙next混和渲染
  • Python连接和操作Elasticsearch详细指南
  • MyBatis 配置文件全解析
  • 【开源免费】基于SpringBoot+Vue.JS作业管理系统(JAVA毕业设计)
  • [python3]Excel解析库-xlrd
  • 简历_专业技能_熟悉分布式锁Redisson的原理以及使用
  • Linux2.4.20顶层Makefile文件分析
  • 【网络安全实验室】SQL注入实战详情
  • Fast R-CNN模型详解及分析
  • 【顶刊TPAMI 2025】多头编码(MHE)之极限分类 Part 3:算法实现
  • MFC读写文件实例
  • asp.net core中的 Cookie 和 Session
  • CSS——7.CSS注释
  • 信号的产生、处理
  • S32K144 UDSdoCAN 升级刷写实现笔记
  • 【动手学电机驱动】STM32-MBD(3)Simulink 状态机模型的部署
  • Qt之屏幕录制设计(十六)
  • 系统架构师考试-ABSD基于架构的设计方法
  • python 实现贪心算法(Greedy Algorithm)
  • 2025 年前端新技术如何塑造未来开发生态?
  • 解决CentOS 8 YUM源更新后报错问题:无法下载AppStream仓库元数据
  • SMMU软件指南之使用案例(Stage 2使用场景)
  • MySQL第四弹----数据库约束和数据库设计