Vue3中reactive响应式失效的问题

情景阐述

弹窗内部有一个挑选框,要通过请求接口获取挑选框下面可供选择的数据。

这是一个很简单的情境,我立刻有了自己的思路。如果实现搜索,数据较少可以直接用elementplus自带的filter。如果数据较多,就需要传val,在后台进行搜索,然后分页渲染。我选择的是前者,所以只需要把数据渲染上去就可以。

我的做法也很标准,我定义了一个option,因为获取的一定是个数组类型的数据,里面会有对象,对象中的属性是label。就类似于这种:

javascript 复制代码
const pingminOptions = reactive([
	{
		value: '',
		label: ''
	}
])

做好一切准备工作后,我就请求后端接口,拿到了一个新的数组。并把数组的值赋值给了pingminOptiions。

随后发现响应式出现问题,数据更改成功,但是没有办法实现在页面上渲染。(数据的单向绑定出现问题)

发现问题的过程

我和我的组长一起改了很久,因为前面的人的代码很乱,一开始都是用let来定义,所以看不出问题。但是一旦是const就出现报错。

const报错,说明这个引用型数据的存放位置都发生了变化。

前面我们定义了一个响应式数据pingminOptions,如果我们获取到的是data.records。那么:

javascript 复制代码
pingminOptions = data.records

这样的做法,会导致数据存放位置发生变化,而且原先的data.records并不是一个响应式数据,所以新定义的pingminOptions的响应式也失效了。

正确做法

正确的做法,我们可以给pingmingOptions中:

javascript 复制代码
const pingmingOptions = {
	option: []
}

定义一个option来存放数据。接着我们就可以把data.records的值给option。

为什么要这么做?

这么做的原因是,用reactive定义出来的数据,内部的对象或者数组也是响应式的,它是深层次的。所以我们不用担心pingmingOptions的响应式失效问题。

关于toRefs

在和组长交流的过程中,我们也曾一度考虑是不是没有用到toRefs的问题,于是也复习了toRefs。toRefs的作用,一般用于解构。

比如我的state对象中有很多数据,有state.a,state.b,state.c。

我在渲染页面的时候,每次都要带上state。非常的不方便。因此就可以toRefs(state),这样的话,相当于给a,b,c都变成了一个响应式的属性。那么我们在使用的时候,模板语法中可以直接把a,b,c写出来。这样就方便了书写。

需要注意的是,仅仅是在页面渲染的时候才能简写。

相关推荐
谢尔登3 分钟前
10_从 React Hooks 本质看 useState
前端·ubuntu·react.js
辰同学ovo4 分钟前
从全局登录状态管理学习 Redux
前端·javascript·学习·react.js
爱看书的小沐8 分钟前
【小沐杂货铺】基于Three.js绘制三维艺术画廊3DArtGallery (Three.js,WebGL)
javascript·3d·webgl·three.js·babylon.js·三维画廊
陈随易26 分钟前
2年没用Nodejs了,Bun很香
前端·后端·程序员
donecoding41 分钟前
Corepack 完全解析:从懵到懂,包管理器自由了
前端·node.js·前端工程化
yqcoder1 小时前
端经典面试题:为什么 0.1 + 0.2 !== 0.3?
前端·css
ZC跨境爬虫1 小时前
跟着 MDN 学 HTML day_12:(HTML网页图片嵌入)
前端·javascript·css·ui·html
光影少年1 小时前
reeact虚拟DOM、Diff算法原理、key的作用与为什么不能用index
前端·react.js·掘金·金石计划
用户059540174461 小时前
大模型记忆存储踩坑实录:LangChain 的 ConversationBufferMemory 让我排查了 6 小时
前端·css
是上好佳佳佳呀1 小时前
【前端(十二)】JavaScript 函数与对象笔记
前端·javascript·笔记