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写出来。这样就方便了书写。

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

相关推荐
Henrii_历小海7 小时前
WhatsApp Web 不是手机镜像:多设备协议、本地数据流与出海获客流水线
前端·智能手机
ayqy贾杰7 小时前
Claude Fable 5 提示词泄漏,抓紧学习下
前端·后端·面试
To_OC15 小时前
别再串行写 await 了,Promise.all 才是并行请求的正确打开方式
前端·javascript·promise
To_OC15 小时前
LC 17 电话号码的字母组合:我的回溯算法,就是从这道题开窍的
javascript·算法·leetcode
vipbic16 小时前
中后台越做越乱后,我用插件化把它救回来了
前端·vue.js
Hyyy16 小时前
Computer Use 适合做什么,不适合做什么——一次真实使用后的思考
前端
小和尚同志16 小时前
前端 AI 单元测试思考与落地
前端·人工智能·aigc
invicinble17 小时前
c端系统,其实更像一个信息展示平台
前端
你怎么知道我是队长18 小时前
JavaScript的变量和数据类型介绍
开发语言·javascript·ecmascript
李姆斯18 小时前
管理是否可以被完全量化
前端·产品经理·团队管理