vue3中给数组赋值丢失响应式的解决
作者:凡小多 发布时间:2024-05-22 10:44:41
标签:vue3,数组,赋值,响应式
vue3给数组赋值丢失响应式的解决
由于vue3使用proxy,对于对象和数组都不能直接整个赋值。
只有push或者根据索引遍历赋值才可以保留reactive数组的响应性
const arr = reactive([]);
const load = () => {
const res = [2, 3, 4, 5]; //假设请求接口返回的数据
// 方法1 失败,直接赋值丢失了响应性
// arr = res;
// 方法2 这样也是失败
// arr.concat(res);
// 方法3 可以,但是很麻烦
res.forEach(e => {
arr.push(e);
});
// 方法4 可以
// arr.length = 0 // 清空原数组
arr.push(...res)
}
或者
const state = reactive({
arr: []
});
...
state.arr = res
...
或者
const state = ref([]);
...
state.value= res
...
例子
<template>
<div class="content">
...
<Card title="content组件">
<button @click.prevent="add">ADD</button>
<button @click.prevent="pop">POP</button>
<button @click.prevent="changeList">changeList</button>
{{ list }}
<ProInj></ProInj>
</Card>
</div>
</template>
<script setup lang="ts">
import { reactive, markRaw, ref, defineAsyncComponent, inject, Ref } from 'vue'
...
let flag = ref(true)
let list = inject<Ref<number[]>>('list',ref(reactive<number[]>([])))
// let list = inject<Ref<number[]>>('list', ref<number[]>([1, 2, 3]))
const add = () => list.push(list!.length + 1)
const pop = () => list.pop()
const changeList = () => {
flag.value = !flag.value
if (flag.value) {
list.length = 0
list.push(...[9, 5, 4, 1])
}
else {
list.length = 0
list.push(...[6, 6, 6, 6, 6])
}
}
...
</script>
<style lang="less" scoped>
...
</style>
效果图:
reactive响应式数据赋值丢失响应式问题
reactive响应式数据赋值问题
const ?list = reactive({})
当你接收到接口数据,不要直接赋值 比如 list = data
这样会丢失响应式!
你可以这样做:
?? ?const ?list = reactive({
?? ?arr:[]
})
list.arr = data.arr
或者
将list声明为ref方式
const list = ref([])
list.value = data
这样也不会丢失响应式
原因:reactive声明的响应式对象被list代理 操作代理对象需要有代理对象的前缀,直接覆盖会丢失响应式
来源:https://blog.csdn.net/wgh4318/article/details/125654801


猜你喜欢
- 使用element-resize-detector监听元素宽度变化如图,当我们切换左侧菜单展示效果的时候,右侧内容会对应变宽,但此时的ech
- 我想此时不妨使用字符串参数来帮助我们解决这种情况,利用字符串分割的方法将一个参数分割成数个参数来解决。下面我们看一个例子: 假设现在给你一个
- 前面给大家分享了pandas.merge用法详解,这节分享pandas数据合并处理的姊妹篇,pandas.concat用法详解,参考利用Py
- 1.前言JavaWeb Struts2的 * 我们都能很熟悉,在请求交给Action处理之前,先在 * 中处理,处理完之后再交给Action
- 参考: Smashing magzine翻译+整理: Demix当完成一项前端的工作之后,许多人都会忘记该项目的结构与细节。然而代码并不是马
- 本文实例讲述了Python格式化日期时间的方法。分享给大家供大家参考,具体如下:常用的时间函数如下获取当前日期:time.time()获取元
- 本文实例为大家分享了python实现简易五子棋游戏的具体代码,供大家参考,具体内容如下运行效果: 完整代码+注释: fi
- 早上看了一个贴子,是一个哥们推广自己一个智能的数据库备份系统,他总结了数据库备份过程中所有可能出错的情况,可以借鉴。如果你做DBA时间不长,
- 前言Python文件默认的编码格式是ascii ,无法识别汉字,因为ascii码中没有中文。所以py文件中要写中文字符时,一般在开头加 #
- 最近从某网站下载了一批文档,但是文件是用数字串命名的文档(很多图书馆都这样吧),现在我也下载完了这些文件,也有这些文件的列表,就是不能一个一
- //--------------------弹出层------------------- //popDivId:弹出层div的ID //dr
- 写了一个练手的爬虫...在输出的时候出现了让人很不愉♂悦的问题像这样:令人十分难受啊!#--------------------------
- 我的mysql版本 MYSQL V5.7.9,旧版本请使用:UPDATE mysql.user SET Password=PASSWORD(
- 1、层次索引1.1 定义在某一个方向拥有多个(两个及两个以上)索引级别,就叫做层次索引。通过层次化索引,pandas能够以较低维度形式处理高
- 关键路径计算是项目管理中关于进度管理的基本计算。 但是对于绝大多数同学来说, 关键路径计算都只是对一些简单情形的计算。今天,田老师根据以往的
- 确定数据库内有多少记录,或者确定有多少记录达到了某些标准,这些用ASP完成并非难事。如果你采用了正确的游标类型,你可以用RecordCoun
- MySQL 数据表是由行和列构成的,通常把表的“列”称为字段(Field),把表的&
- 一个成熟的数据库架构并不是一开始设计就具备高可用、高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善。这篇博文主要谈MySQL数据库发
- 1 运行SQLPLUS工具 sqlplus 2 以OS的默认身份连接 / as sysdba 3 显示当前用户名 show user 4 直
- pyinstaller打包引入自己编写的库场景使用pyinstaller打包某个文件后,生成的exe文件无法运行,提示 Module not