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

news2024/10/6 2:31:10

在 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.coloradmin.cn/o/1866622.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

常见图像分割模型介绍:FCN、U-Net、SegNet、Mask R-CNN

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

AI助力校园安全:EasyCVR视频智能技术在校园欺凌中的应用

一、背景分析 近年来&#xff0c;各地深入开展中小学生欺凌行为治理工作&#xff0c;但有的地方学生欺凌事件仍时有发生&#xff0c;严重损害学生身心健康&#xff0c;引发社会广泛关注。为此&#xff0c;教育部制定了《防范中小学生欺凌专项治理行动工作方案》进一步防范和遏…

软件构造 | 期末查缺补漏

软件构造 | 期末查缺补漏 总体观 软件构造的三维度八度图是由软件工程师Steve McConnell提出的概念&#xff0c;用于描述软件构建过程中的三个关键维度和八个要素。这些维度和要素可以帮助软件开发团队全面考虑软件构建的方方面面&#xff0c;从而提高软件质量和开发效率。 下…

文件批量重命名001到100 最简单的数字序号递增的改名技巧

文件批量重命名001到100 最简单的数字序号递增的改名方法。最近看到很多人都在找怎么批量修改文件名称&#xff0c;还要按固定的ID需要递增&#xff0c;这个办法用F2或者右键改名是不能做到的。 这时候我们可以通过一个专业的文件批量重命名软件来批量处理这些文档。 芝麻文件…

A-8 项目开源 qt1.0

A-8 2024/6/26 项目开源 由于大家有相关的需求&#xff0c;就创建一个项目来放置相关的代码和项目 欢迎交流&#xff0c;QQ&#xff1a;963385291 介绍 利用opencascade和vulkanscene实现stp模型的查看器打算公布好几个版本的代码放在不同的分支下&#xff0c;用qt实现&am…

如何获取特定 HIVE 库的元数据信息如其所有分区表和所有分区

如何获取特定 HIVE 库的元数据信息如其所有分区表和所有分区 1. 问题背景 有时我们需要获取特定 HIVE 库下所有分区表&#xff0c;或者所有分区表的所有分区&#xff0c;以便执行进一步的操作&#xff0c;比如通过 使用 HIVE 命令 MSCK REPAIR TABLE table_name sync partiti…

Redis实战—基于setnx的分布式锁与Redisson

本博客为个人学习笔记&#xff0c;学习网站与详细见&#xff1a;黑马程序员Redis入门到实战 P56 - P63 目录 分布式锁介绍 基于SETNX的分布式锁 SETNX锁代码实现 修改业务代码 SETNX锁误删问题 SETNX锁原子性问题 Lua脚本 编写脚本 代码优化 总结 Redisson 前言…

基于盲信号处理的人声分离

1.问题描述 在实际生活中&#xff0c;存在一种基本现象称为“鸡尾酒效应”&#xff0c;该效应指即使在非常嘈杂的环境中&#xff0c;人依然可以从噪声中提取出自己所感兴趣的声音。 在实际应用中&#xff0c;我们可能需要对混合的声音进行分离&#xff0c;此时已知的只有混合…

springcloud第4季 springcloud-alibaba之openfegin+sentinel整合案例

一 介绍说明 1.1 说明 1.1.1 消费者8081 1.1.2 openfegin接口 1.1.3 提供者9091 9091微服务满足&#xff1a; 1 openfegin 配置fallback逻辑&#xff0c;作为统一fallback服务降级处理。 2.sentinel访问触发了自定义的限流配置&#xff0c;在注解sentinelResource里面配置…

DVWA 靶场 SQL Injection 通关解析

前言 DVWA代表Damn Vulnerable Web Application&#xff0c;是一个用于学习和练习Web应用程序漏洞的开源漏洞应用程序。它被设计成一个易于安装和配置的漏洞应用程序&#xff0c;旨在帮助安全专业人员和爱好者了解和熟悉不同类型的Web应用程序漏洞。 DVWA提供了一系列的漏洞场…

数学建模--Matlab求解线性规划问题两种类型实际应用

1.约束条件的符号一致 &#xff08;1&#xff09;约束条件的符号一致的意思就是指的是这个约束条件里面的&#xff0c;像这个下面的实例里面的三个约束条件&#xff0c;都是小于号&#xff0c;这个我称之为约束条件符号一致&#xff1b; &#xff08;2&#xff09;下面的就是上…

关于linux的图形界面

关于linux的图形界面 1. 概述1.1 X1.2 DM&#xff08;显示管理器/登录管理器&#xff09;1.3 WM&#xff08;窗口管理器&#xff09;1.4 GUI Toolkits1.5 Desktop Environment1.6 基本架构 2. 安装桌面2.1 Centos安装桌面2.2 Ubuntu安装桌面&#xff08;未实践&#xff09; 3. …

批量打造怀旧风情:视频批量剪辑将现代视频打造成怀旧经典老视频效果

在繁忙的现代生活中&#xff0c;我们时常怀念那些旧时光&#xff0c;那些充满岁月痕迹的老电影片段。它们不仅记录了一个时代的风貌&#xff0c;更承载了无数人的情感与记忆。你是否想过&#xff0c;将现代的视频素材打造成这种怀旧经典的老视频效果&#xff0c;让每一帧都充满…

Python将Word文档转换为图片(JPG、PNG、SVG等常见格式)

将Word文档以图片形式导出&#xff0c;既能方便信息的分享&#xff0c;也能保护数据安全&#xff0c;避免被二次编辑。文本将介绍如何使用 Spire.Doc for Python 库在Python程序中实现Word到图片的批量转换。 目录 Python 将Word文档转换为JPG、JPEG、PNG、BMP等图片格式 Py…

基于信息论的高动态范围图像评价算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于信息论的高动态范围图像评价算法matlab仿真&#xff0c;利用一种自然图像的概率模型对图像的熵与成像动态范围之间的关系进行了数值模拟,得到了具有普遍意义上…

YOLOv10改进 | 卷积模块 | 将Conv替换为轻量化的GSConv【轻量又涨点】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录&#xff1a;《YOLOv8改进有效…

Docker搭建ELK

docker安装ElasticSearch 创建网络 #这里先创建一个网络&#xff1a;因为我们还需要部署kibana容器、logstash容器&#xff0c;需要让这些容器互联。 docker network create elk-net#查看网络 docker network ls下载ES镜像 #搜索镜像 docker search elasticsearch #下载镜像…

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

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

OAuth2.0 三方登录(Google登录)

一、OAuth2.0流程 &#xff08;A&#xff09;客户端向从资源所有者请求授权。&#xff08;B&#xff09;客户端收到授权许可&#xff0c;资源所有者给客户端颁发授权许可&#xff08;比如授权码code&#xff09;&#xff08;C&#xff09;客户端与授权服务器进行身份认证并出示…

基于SpringBoot的学生综合测评系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot框架 工具&#xff1a;MyEclipse、Tomcat 系统展示 首页 系统首页&#xff0c;提供综合…