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

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

相关推荐
@小红花41 分钟前
从0到1学习Vue框架Day03
前端·javascript·vue.js·学习·ecmascript
前端与小赵43 分钟前
vue3中 ref() 和 reactive() 的区别
前端·javascript·vue.js
魔云连洲1 小时前
Vue的响应式底层原理:Proxy vs defineProperty
前端·javascript·vue.js
专注VB编程开发20年1 小时前
CSS定义网格的列模板grid-template-columns什么意思,为什么要用这么复杂的单词
前端·css
IT_陈寒1 小时前
Redis性能提升50%的7个关键优化策略,90%开发者都不知道第5点!
前端·人工智能·后端
Hilaku1 小时前
深入URL和URLSearchParams:别再用正则表达式去折磨URL了
前端·javascript·代码规范
pubuzhixing1 小时前
Canvas 的性能卓越,用它解决一个棘手问题
前端
weixin_456904271 小时前
Vue.jsmain.js/request.js/user.js/store/index.js Vuex状态管理项目核心模块深度解析
前端·javascript·vue.js
伍哥的传说1 小时前
Vue 3.6 Alien Signals:让响应式性能飞跃式提升
前端·javascript·vue.js·vue性能优化·alien-signals·细粒度更新·vue 3.6新特性
永日456701 小时前
学习日记-HTML-day51-9.9
前端·学习·html