最新版vue3+TypeScript开发入门到实战教程之toRefs与toRef实用技巧

toRefs与toRef概述

引用官网的一句话,将一个响应式对象转换为一个普通对象,这个普通对象的每个属性都是指向源对象响应属性的ref。每个单独的ref都是使用toRef创建的。

反复读几次,发现还是有些懵,不易理解。通过一些事例,一步步解读,再回头看看这句,就不难理解。

给响应式对象结构解析赋值

对象结构解析,是很常用且舒适的获取对象成员的方法,若下代码

复制代码
let fish = { name: '鲫鱼', price: 10 };
let { name, price } = fish;
console.log(name);
console.log(price);
name = '草鱼'
price = 20;
console.log(fish);

运行打印输出。我们发现,name,age能够得到fish中的值,但改变name、age并不能改变fish中的值。如下图:

若将响应式对象结构解析,获取到的成员变量是否是响应式的。

  • 定义响应式对象fish,let fish = reactive({ name: '鲫鱼', price: 10 })

  • 解析fish数据,let { name, price } = fish;

  • 模版分别渲染name,price,fish内数据

  • 改变name,price,fish内数据
    具体代码如下:

运行点击改变鱼类1 与改变价格1 按钮,页面中只有鱼类1、价格1做响应变化。点击改变鱼类2 与改变价格2页面无任何变化。

  • 改变fish.name,页面响应改变,name不变
  • 改变fish.price,页面响应改变,price不变
  • 改变name,页面无响应,pirce.name不变
  • 改变price,页面无响应,price.name不变
    结论是name只是从fish.name获取到值,与fish.name再没有关系,也不是响应式对象,同理price。
    操作效果如下图

toRefs将响应式对象结构解析数据变成响应式

toRefs函数,将响应式对象内的数据,与解析后的数据划上一个等号,两者是同一个东西。如下代码

复制代码
let fish = reactive({ name: '鲫鱼', price: 10 });
let { name, price } = toRefs(fish);
  • name是fish.name一个引用。name变,fish.name变;fish.name变,name变

  • 同理,price和fish.price也是如此。

  • name与price变成ObjectRefImpl 结构数据,ObjectRefImpl结构都是用ref定义的

  • 访问改变name、price数据时,都需加.value

运行查看效果,分别点击四个按钮,页面都有变化,控制台打印输出fish与name,查看两者区别

toRef将响应式对象中的一个数据变成响应式

在实际应用开发中,可能并不需要将所有的成员变量都变成响应式,只需要其中一个,那就使用toRef。使用方法很简单

复制代码
let fish = reactive({ name: '鲫鱼', price: 10 });
let name = toRef(fish,'name');
console.log(name);

打印name其结构如下:

toRefs返回值到底是什么

复制代码
let fish = reactive({ name: '鲫鱼', price: 10 });
console.log(fish)
console.log(toRefs(fish))

如图

我们看看,fish下的name与price都变成ref定义的数据。回头再来看看官网说明,是否都明白了。
将一个响应式对象转换为一个普通对象,这个普通对象的每个属性都是指向源对象响应属性的ref。每个单独的ref都是使用toRef创建的。

相关推荐
李剑一3 分钟前
AntDesign老版本没有月份和年份区间选择组件?我封装了一个完美版,附源码!
前端·vue.js
牧艺6 分钟前
浏览器端 3D 看车重磅升级:从三款展车到可试驾的八车展厅
前端·three.js·交互设计
老男孩游戏时光17 分钟前
Electron 桌面应用开发入门,前端也能写客户端
前端
默_笙23 分钟前
🚊 别再让 AI 的记忆写两遍了:PostgreSQL 把关系查询和语义检索装进一张表
前端·javascript
进击的明明24 分钟前
TypeScript速通笔记(下)
前端·面试·typescript
lzhdim27 分钟前
C#不为人知的10个魔法特性:资深开发者也会震惊的底层奥秘
java·前端·javascript·算法·c#
zach2 小时前
前端落地实战:Next.js 项目 Nginx + PM2 生产部署全流程(附踩坑总结)
前端·pm2·next.js
overmind2 小时前
oeasy教h5前端001 修改的乐趣_直接修改在线网页
前端
只睡四小时2 小时前
JS 手写 D-pad 空间导航:电视端焦点引擎实战
android·开发语言·前端·javascript·ecmascript·hls·空间导航
恋猫de小郭2 小时前
Android 原生的 Compose A2UI 也来了,你还抱着 XML 养老吗?
android·前端·flutter