Vue中数组的【响应式】操作

在 Vue.js 中,当你修改数组时,Vue 不能检测到以下变动的数组:

  1. 当你利用索引直接设置一个项时,例如:vm.items[indexOfItem] = newValue
  2. 当你修改数组的长度时,例如:vm.items.length = newLength

为了解决这个问题并确保你的数组变动是响应式的,Vue 提供了一些变异方法,你可以使用它们来修改数组:

7个保证响应式方法(这些方法会触发视图更新):

  • push()
  • pop()
  • shift()
  • unshift()
  • splice()
  • sort()
  • reverse()

方法详解:

在 Vue.js 中,为了使得数组的变动是响应式的,Vue 提供了一些特定的数组方法来修改数组,这些方法会触发视图的更新。以下是 Vue 中用于数组响应式的 7 个方法及其详解:

  1. push(item1, ..., itemN)
    • 向数组的末尾添加一个或多个元素,并返回新的长度。
    • 示例:this.array.push(item);
  2. pop()
    • 删除并返回数组的最后一个元素。
    • 示例:let lastItem = this.array.pop();
  3. shift()
    • 删除并返回数组的第一个元素。
    • 示例:let firstItem = this.array.shift();
  4. unshift(item1, ..., itemN)
    • 向数组的开头添加一个或多个元素,并返回新的长度。
    • 示例:this.array.unshift(item);
  5. splice(index, deleteCount, item1, ..., itemN)
    • 通过删除或替换现有元素或者添加新元素来改变一个数组的内容。
    • index(必需):开始改变的索引。
    • deleteCount(必需):整数,表示要移除的数组元素的个数。
    • item1, ..., itemN(可选):要添加进数组的元素,从index 位置开始。
    • 示例:this.array.splice(2, 0, 'a', 'b'); // 在索引 2 的位置插入 'a' 和 'b'
  6. sort(compareFunction)
    • 对数组的元素进行排序,并返回数组。
    • compareFunction(可选):用来指定按某种顺序进行排序的函数。如果省略,元素将按照转换为的字符串的 Unicode 码点顺序进行排序。
    • 示例:this.array.sort((a, b) => a - b); // 从小到大排序
  7. reverse()
    • 颠倒数组中元素的顺序。
    • 示例:this.array.reverse();

注意

  • 使用以上方法修改数组时,Vue 将能够检测到这些变化,并触发相应的视图更新。
  • 但是,如果你使用索引直接设置数组项(例如 this.array[indexOfItem] = newValue)或使用 length 属性来修改数组长度,Vue 则不能检测到这些变化。
  • 在 Vue 3 中,响应式系统有所改变,但基本的数组响应式方法仍然适用。Vue 3 引入了 Composition API,你可以使用 reactive 或 ref 来创建响应式数组,并使用上述方法来修改它们。
  • 如果你需要直接修改数组中的某个元素(使用索引),你可以使用 Vue.set(在 Vue 2 中)或 reactive 搭配 Proxy(在 Vue 3 中)来确保变化是响应式的。但在大多数情况下,使用上述的数组方法更为简单和直观。

但是,如果你需要直接修改数组中的某个元素(使用索引),或者你需要替换整个子数组,你需要确保这种变化也是响应式的。有几种方法可以处理这种情况:

  1. 使用 Vue 的 Vue.set() 方法(在 Vue 2.x 中)或 this.$set() 实例方法(在 Vue 组件内部)。但是,对于数组,这主要用于添加新属性到响应式对象上,而不是用于直接修改数组项。

  2. 使用 splice() 方法替换数组中的某个元素或子数组。

对于替换数组中的子数组(即你提到的“列”),你可以使用 splice() 方法,但你需要遍历外层数组,并对每个子数组执行 splice()。例如:

methods: {  
  replaceColumn(columnIndex, newColumn) {  
    this.multiArray.forEach(row => {  
      // 假设 newColumn 的长度与 row 的长度相匹配,或者你只需要替换部分项  
      row.splice(columnIndex, row.length - columnIndex, ...newColumn);  
    });  
  }  
}

在上面的例子中,multiArray 是一个二维数组,columnIndex 是你想要替换的列的索引,newColumn 是一个新数组,包含了替换后的值。

  • 使用计算属性或方法来返回一个新的数组,而不是直接修改原始数组。这种方法不会改变原始数组,但会基于原始数组创建一个新的响应式数组。

请注意,从 Vue 3 开始,响应式系统进行了重写,引入了 reactive 和 ref API。如果你使用的是 Vue 3,你可能会使用 Composition API 和这些新的响应式 API 来处理数组。但是,基本的响应式原则仍然适用,即使用 Vue 提供的变异方法来确保视图更新。

 案例:

需求:修改3*5数组,第一列保留原来数据,后面用一个3*4的数组【后端响应】替换原有值

  •  刚开始直接替换数组各个单元格的值,数组数据是变化了,但是不是响应式,无法导致依赖此数据的视图发生改变
// // 更新原始数组,保留第一列,并用3x4矩阵替换其余列
              for (let i = 0; i < that.tableData.length; i++) {
                // 保留第一列的值
                let firstColumnValue = that.tableData[i][0];

                // 替换后面的列
                for (let j = 1; j < that.tableData[i].length; j++) {
                  // 如果j的值超过了replacementMatrix的列数,则停止替换(可选)
                  if (j > replacementArr[i].length) {
                    break;
                  }
                  that.tableData[i][j] = replacementArr[i][j - 1]; // 减去1是因为replacementMatrix的索引从0开始
                }
              }
  • 然后试着用splice()[可行,为响应式] 
              that.tableData.forEach((item,rowIndex)=>{
                //splice():array.splice(start[, deleteCount[, item1[, item2[, ...]]]])
                item.splice(1,item.length-1,...replacementArr[rowIndex])
              })
              

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/747563.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

谷歌上搞下来的,无需付费,可以收藏!

在数字化时代&#xff0c;我们越来越依赖于智能设备来获取信息和知识。中国智谋App正是这样一款应用&#xff0c;它将中国古代的智慧与谋略书籍带入了我们的移动设备&#xff0c;让我们能够随时随地学习和领悟。而且提供文言文的原文和译文。 软件下载方式&#xff1a;谷歌上搞…

39.右键弹出菜单管理游戏列表

上一个内容&#xff1a;38.控制功能实现 以 ​​​​​​​ 38.控制功能实现 它的代码为基础进行修改 效果图&#xff1a; 点击设置之后的样子 点击删除 点击删除之后的样子 实现步骤&#xff1a; 首先添加一个菜单资源&#xff0c;右击项目资源选择下图红框 然后选择Menu 然…

Docker(九)-Docker运行redis6.0.8容器实例

1.宿主机新建目录存放redis.conf文件 目的&#xff1a;运行redis容器实例时使用自己的配置文件2.运行redis容器实例 docker run -d -p 6379:6379 --privilegedtrue -v 【宿主机配置文件目录】:/etc/redis/redis.conf -v 【宿主机数据目录】:/data --nameredis6.0.8 redis:6.0…

Keka for Mac:轻量级压缩解压神器

Keka for Mac是一款专为Mac用户打造的轻量级压缩解压软件&#xff0c;凭借其强大的功能和简洁易用的界面&#xff0c;赢得了众多用户的喜爱。无论是日常办公还是学习娱乐&#xff0c;Keka都能为您提供高效、安全的文件压缩和解压体验。 Keka for Mac v1.4.2中文版下载 产品特点…

记录一次CMS的代码审计

本次代码审计使用了白加黑的手法&#xff0c;用黑盒的视角测试功能点&#xff0c;用白盒的方式作为验证。 0x1 XSS guestbook处&#xff0c;可以看到有一个留言板 idea搜索guestbook。发现代码如下&#xff0c;其中的getModel是获取数据的方法。Guestbook.class就是具体要获取…

MySQL索引优化解决方案--索引介绍(1)

什么是索引 MySQL官方对于索引的定义&#xff1a;索引是帮助MySQL高效过去数据的数据结构。 MySQL在存储数据之外&#xff0c;数据库系统中还维护着满足特定查找算法的数据结构&#xff0c;这些数据结构以某种引用&#xff08;指向&#xff09;表中的数据&#xff0c;这样我们…

使用ChatGPT提升编程效率:程序员的最佳实践分享

在这个信息技术飞速发展的时代&#xff0c;编程已经成为了越来越多人的必备技能。无论你是初学者&#xff0c;还是经验丰富的开发者&#xff0c;都可能会遇到编程中的各种问题和挑战。幸运的是&#xff0c;AI 技术的进步让我们有了新的解决工具——ChatGPT。作为一名科技博客博…

51单片机STC89C52RC——9.1 DS1302涓流充电计时芯片

目录 目的/效果 一&#xff0c;STC单片机模块 二&#xff0c;DS1302计时器 2.1 特性/板子位置 2.1.1 特性 2.1.2 板子上的位置 2.2 针脚定义 2.3 数据传输 2.3.1 读数据 2.3.2 写数据 2.4 BCD码 2.5 可编程涓流充电器 2.6 时钟动态设置 三&#xff0c;创建Keil项目…

Leetcode 102.目标和

给定一个正整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 ‘’ 或 ‘-’ &#xff0c;然后串联起所有整数&#xff0c;可以构造一个 表达式 &#xff1a; 例如&#xff0c;nums [2, 1] &#xff0c;可以在 2 之前添加 ‘’ &#xff0c;在 1 之前添加 ‘-’ &…

2024最新pd激活码 Parallels Desktop 19 激活秘钥分享

Parallels Desktop 19 for Mac 乃是一款适配于 Mac 的虚拟化软件。它能让您在 Mac 计算机上同时运行多个操作系统。您可借此创建虚拟机&#xff0c;并于其中装设不同的操作系统&#xff0c;如 Windows、Linux 或 macOS。使用 Parallels Desktop 19 mac 版时&#xff0c;您可在 …

【UE5.3】笔记2--资源导入

资源导入 方式一&#xff1a;内置资源--初学者内容包 方式二&#xff1a;虚幻商城 搜索免费资源&#xff1a; 添加到工程之后 搜素&#xff1a;虚幻学习工具包&#xff0c;需要注意的是支持的引擎版本 当然商城里包含了大量的免费的资源&#xff0c;初期学习不想投入太多可以…

OpenCL在移动端GPU计算中的应用与实践

一、引言 移动端芯片性能的不断提升为在手机上进行计算密集型任务&#xff0c;如计算机图形学和深度学习模型推理&#xff0c;提供了可能。在Android设备上&#xff0c;GPU&#xff0c;尤其是高通Adreno和华为Mali&#xff0c;因其卓越的浮点运算能力&#xff0c;成为了异构计…

OZON跨境卖家爆款产品有哪些

OZON跨境卖家爆款产品有哪些&#xff1f;国内的Ozon跨境卖家做这几个品&#xff0c;不爆都难&#xff01; Top1 太阳镜 Очки солнцезащитные 商品id&#xff1a;1556874194 月销量&#xff1a;1095 OZON跨境卖家爆款产品工具&#xff1a;D。DDqbt。COm/…

【Docker】Docker简介_运行原理

1、简介 1.1基本概念 容器&#xff1a;容器是Docker的基本部署单元。它是一个轻量级的、独立的运行时环境&#xff0c;包含应用程序及其相关依赖。容器利用Linux内核的命名空间和控制组技术&#xff0c;实现了隔离性和资源管理&#xff0c;使得应用程序在不同的容器中运行不会…

2024 最新运营小工具 API 推荐,助力高效工作

在当今数字化运营的时代&#xff0c;各种高效便捷的 API 服务成为了企业和个人提升运营效率、获取精准数据的得力助手。无论是进行市场调研、拓展业务&#xff0c;还是优化网络资源配置&#xff0c;都离不开这些强大的工具。本文将为您详细介绍一系列实用的运营小工具 API 服务…

使用API有效率地管理Dynadot域名,为文件夹更名

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(十八)

课程地址&#xff1a; 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程&#xff0c;一套精通鸿蒙应用开发 &#xff08;本篇笔记对应课程第 28 节&#xff09; P28《27.网络连接-Http请求数据》 案例&#xff1a; 这里不懂后端假设服务器的前端小伙伴就需要课程源码资料了…

华三交换机的软件版本升级操作

升级操作很常见&#xff0c;掌握方法是关键 实验环境&#xff1a;1台华三S6520-EI交换机&#xff0c;版本从2432P03升级成2432P05。 整体思路&#xff1a; 1.先查验软件版本 2.官网下载对于设备型号的软件版本 3.配置交换机地址使得与电脑进行通信&#xff0c;使用TFTP/FTP工…

宿主机无法通过ip连接wsl2解决方案

文章目录 原因排查网络模式win11防火墙关闭wsl ubuntu防火墙 如果之前能连接现在连接不上可以参考该方案 原因排查 网络模式win11防火墙(win11新增了Hyper-V防火墙)wsl2 ubuntu防火墙 网络模式 wsl2的默认网络模式是NAT&#xff0c;建议修改为镜像模式。在C:\Users\<User…

深圳,不止是“搞钱之都”

深圳又结结实实火了一把。 “建议深圳人吃饭不要谈工作”&#xff0c;这条微博话题热度飙升&#xff0c;超过五百多万人围观&#xff0c;引来无数网友吐槽“深圳人饭局的真实写照”。 从高档粤菜包间到路边小摊&#xff0c;从茶餐厅到烧烤摊&#xff0c;深圳人吃饭似乎总绕不…