Vue 3 数组变更详解:哪些操作会修改原数组?| 笔记

Vue 3 使用 Proxy 来侦测响应式对象的变化,数组作为常用数据类型,自然也被 Vue 3 自动侦测和管理。在处理数组时,了解哪些操作会修改原数组,哪些操作不会修改原数组,对高效编写 Vue 应用程序至关重要。

本文将详细介绍 Vue 3 中的常见数组操作,并按照是否会修改原数组进行分类说明。


一、会修改原数组的方法

这些方法会直接改变原数组的内容,因此 Vue 3 的响应式系统能检测到这些变更,并自动触发相关的视图更新。

1. push()
  • 功能:向数组末尾添加一个或多个元素。

  • 返回值:新数组的长度。

  • 示例:

    const arr = reactive([1, 2, 3]);
    arr.push(4); // 数组变为 [1, 2, 3, 4]
    
2. pop()
  • 功能:移除数组末尾的一个元素。

  • 返回值:被移除的元素。

  • 示例:

    const arr = reactive([1, 2, 3]);
    arr.pop(); // 数组变为 [1, 2]
    
3. shift()
  • 功能:移除数组开头的一个元素。

  • 返回值:被移除的元素。

  • 示例:

    const arr = reactive([1, 2, 3]);
    arr.shift(); // 数组变为 [2, 3]
    
4. unshift()
  • 功能:在数组开头添加一个或多个元素。

  • 返回值:新数组的长度。

  • 示例:

    const arr = reactive([1, 2, 3]);
    arr.unshift(0); // 数组变为 [0, 1, 2, 3]
    
5. splice()
  • 功能:在数组中添加、删除或替换元素。

  • 返回值:被删除的元素(如果有)。

  • 示例:

    const arr = reactive([1, 2, 3, 4]);
    arr.splice(1, 2); // 删除索引 1 开始的两个元素,数组变为 [1, 4]
    
6. sort()
  • 功能:对数组元素进行原地排序。

  • 返回值:排序后的数组。

  • 示例:

    const arr = reactive([3, 1, 4, 2]);
    arr.sort(); // 数组排序后为 [1, 2, 3, 4]
    
7. reverse()
  • 功能:颠倒数组元素的顺序。

  • 返回值:颠倒后的数组。

  • 示例:

    const arr = reactive([1, 2, 3]);
    arr.reverse(); // 数组变为 [3, 2, 1]
    

二、不会修改原数组的方法

这些方法不会直接修改原数组,而是返回一个新的数组或值。因此,Vue 3 响应式系统不会通过这些方法本身侦测到数组的变化,但如果将它们的返回值重新赋值给响应式对象,Vue 仍然能侦测到变更并更新视图。

1. concat()
  • 功能:合并两个或多个数组,返回一个新数组。

  • 返回值:合并后的新数组。

  • 示例:

    const arr = reactive([1, 2]);
    const newArr = arr.concat([3, 4]); // 新数组为 [1, 2, 3, 4]
    
2. slice()
  • 功能:返回数组中指定范围的浅拷贝片段,不修改原数组。

  • 返回值:新数组。

  • 示例:

    const arr = reactive([1, 2, 3, 4]);
    const slicedArr = arr.slice(1, 3); // 新数组为 [2, 3]
    
3. map()
  • 功能:对数组中的每个元素执行回调函数,返回一个新数组。

  • 返回值:经过回调函数处理后的新数组。

  • 示例:

    const arr = reactive([1, 2, 3]);
    const mappedArr = arr.map(x => x * 2); // 新数组为 [2, 4, 6]
    
4. filter()
  • 功能:返回满足条件的元素组成的新数组。

  • 返回值:筛选后的新数组。

  • 示例:

    const arr = reactive([1, 2, 3, 4]);
    const filteredArr = arr.filter(x => x > 2); // 新数组为 [3, 4]
    
5. reduce()reduceRight()
  • 功能:对数组中的每个元素执行回调函数,最终返回一个累积结果。

  • 返回值:累积结果。

  • 示例:

    const arr = reactive([1, 2, 3]);
    const sum = arr.reduce((acc, x) => acc + x, 0); // 返回累积值 6
    
6. flat()flatMap()
  • 功能:返回一个扁平化后的新数组。

  • 返回值:新数组。

  • 示例:

    const arr = reactive([1, [2, 3], [4]]);
    const flattenedArr = arr.flat(); // 新数组为 [1, 2, 3, 4]
    
7. find()findIndex()
  • 功能find() 返回第一个满足条件的元素,findIndex() 返回满足条件元素的索引。

  • 返回值find() 返回元素,findIndex() 返回索引。

  • 示例:

    const arr = reactive([1, 2, 3, 4]);
    const foundItem = arr.find(x => x > 2); // 返回 3
    

三、Vue 3 数组侦测的注意事项

  1. 自动侦测修改:对于会修改原数组的方法(如 push()splice() 等),Vue 3 能够自动侦测到这些操作并触发视图更新。

  2. 不会修改原数组的操作:虽然这些方法不会修改原数组,但如果你将它们的返回值重新赋值给响应式对象,Vue 依然会检测到变化并更新视图。例如:

    const arr = reactive([1, 2, 3]);
    arr = arr.concat([4, 5]); // Vue 会检测到重新赋值并触发更新
    
  3. 对象属性变化侦测:如果数组中包含对象,Vue 3 也能侦测到对象属性的变化。例如:

    const arr = reactive([{ name: 'Alice' }, { name: 'Bob' }]);
    arr[0].name = 'Eve'; // Vue 会侦测到对象属性的变化
    

四、总结

  • 会修改原数组的方法push()pop()shift()unshift()splice()sort()reverse()
  • 不会修改原数组的方法concat()slice()map()filter()reduce()flat()find() 等。

通过区分这些数组操作,你可以更好地控制 Vue 3 的响应式系统行为,确保数据变更时视图能够正确更新。如果需要保留原数组不变,可以选择不会修改原数组的方法,并将返回的新数组赋值回响应式对象。

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

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

相关文章

LeetCode 面试经典150题 Z字形变换

题目: 将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下: P A H N A P L S I I G Y I R 之后,你…

windows recvfrom错误10014

使用windows socket的udp客户端与linux udp服务端通讯,windows发送数据正常,接收偶尔不正常,但是通过抓包发现服务端是发送了数据给客户端的,网上找了很急都没解决,最后发现是windows与linux下 recvfrom 最后一个参数有…

CSS——文字打字机效果

CSS——文字打字机效果 本文通过纯 CSS 实现文字的打字机效果&#xff0c;然后借助 JS 实现了扩展。 typewriter 基本思路 使用伪元素覆盖原文字&#xff0c;并且使用伪元素模拟闪烁的光标效果。 具体流程 首先是一些基本的设置 <!DOCTYPE html> <html lang"…

什么是Qseven?模块电脑(核心板)规范标准简介二

1.概念 Qseven是一种通用的、小尺寸计算机模块标准&#xff0c;适用于需要低功耗、低成本和高性能的应用。 Qseven模块电脑&#xff08;核心板&#xff09;采用230Pin金手指连接器 2.Qseven的起源 Qseven最初是由Congatec、SECO、MSC三家欧洲公司于2008年发起&#xff0c;旨在…

Python中的SQLAlchemy:解锁数据库操作的新世界

引言 SQLAlchemy是一个Python SQL工具包和ORM&#xff0c;它提供了全面的企业级持久性模式。通过SQLAlchemy&#xff0c;你可以使用Python类来定义数据库表&#xff0c;并使用面向对象的方式来进行数据库操作&#xff0c;如查询、更新等。这种ORM方法不仅使代码更加简洁易读&a…

基因科技领军企业——桐树基因完成D轮融资,创新科技引领生命科学

2024年10月8日&#xff0c;无锡桐树生物科技有限公司&#xff08;以下简称桐树基因&#xff09;正式完成过亿元人民币D轮融资。本轮融资由无锡市梁溪科创产业投资基金&#xff08;博华资本管理&#xff09;领投&#xff0c;江苏建道创业投资有限公司跟投&#xff0c;总额过亿元…

简单谈谈Spring 中Aware是什么

在spring中&#xff0c;aware是spring提供的一种扩展机制 在一般情况中&#xff0c;是不需要感知容器的存在的&#xff0c;spring 会帮我们自动装配完成。 但是在一些特定的场景下&#xff0c;比如我需要获取spring容器中的某个对象&#xff0c;那么就需要获取到 spring 上下文…

大数据学习---快速了解clickhouse数据库

ClickHouse数据库介绍 ClickHouse是一款由Yandex开发的列式数据库管理系统&#xff08;DBMS&#xff09;&#xff0c;适用于在线分析处理&#xff08;OLAP&#xff09;场景。它具有高性能、可扩展性、实时更新等特点&#xff0c;适用于处理大规模数据。 特点 列式存储&#x…

【数据结构】二叉树(一)遍历

导言 前面以及有了堆的基础&#xff0c;现在来学习二叉树。二叉树的学习和前面的数据结构很不一样&#xff0c;前面我们主要学习用数据结构储存数据&#xff0c;以及实际手搓数据结构的增删查改&#xff1b;而学习二叉树主要是为我们以后学搜索二叉树以及后面的AVL树等数据结构…

Android中的View绘制流程

Android中的View绘制流程是一个复杂而精细的过程&#xff0c;它确保了应用程序中的用户界面能够准确、高效地呈现在用户眼前。以下将详细阐述Android View的绘制流程&#xff0c;包括测量&#xff08;Measure&#xff09;、布局&#xff08;Layout&#xff09;和绘制&#xff0…

2024.10.10计算机外部设备及调试培训

授课老师&#xff1a;杨戬 1.计算机组成 cpu&#xff0c;主板&#xff0c;内存&#xff0c;硬盘&#xff0c;电源&#xff0c;显示器&#xff0c;键盘和鼠标&#xff0c;光驱和显卡&#xff0c;其他外部设备。 2.虚拟机专业版转换 由于我们在2024.10.8的培训中已经安装了wi…

GPT4o,GPTo1-preview, 拼

兄弟们GPT刚开的 需要上车的扣&#xff0c;工作用 大家一起PIN分摊点压力。 在当今数字化的时代&#xff0c;程序员这一职业已经从幕后走到了前台&#xff0c;成为推动科技进步和社会变革的关键力量。编写代码、解决问题、不断学习新技术&#xff0c;程序员们的日常充满了挑战与…

React基础知识

说明&#xff1a;react版本为 18.3.1 React是什么 React由Meta公司研发&#xff0c;是一个用于构建Web和原生交互界面的库。&#xff08;开发基于浏览器的web应用和基于mac和android的移动应用&#xff09;React的优势 1.相较于传统基于DOM开发的优势&#xff1a;组件化的开…

【物流配送中心选址问题】基于退火算法混合粒子群算法

课题名称&#xff1a; 基于退火算法混合粒子群算法的物流配送中心选址问题 改进方向&#xff1a;模拟退火算法优化粒子群算法 代码获取方式&#xff08;付费&#xff09;&#xff1a; 模型说明&#xff1a; 待补充 Matlab仿真结果&#xff1a; 1. 模型优化后的仿真结果 2…

Java入门:11.抽象类,接口,instanceof,类关系,克隆

1 JDK中的包 JDK JRE 开发工具集&#xff08;javac.exe&#xff09; JRE JVM java类库 JVM java 虚拟机 jdk中自带了许多的包&#xff08;类&#xff09; &#xff0c; 常用的有 java.lang 该包中的类&#xff0c;不需要引用&#xff0c;可以直接使用。 例如&#xff1…

Flash Attention:高效注意力机制的突破

近年来&#xff0c;注意力机制(Attention)已成为自然语言处理和深度学习领域的重要工具。然而&#xff0c;传统的注意力实现在处理长序列时存在计算和内存效率低下的问题。为了解决这一挑战&#xff0c;研究者们提出了Flash Attention&#xff0c;一种快速、内存高效的注意力算…

人类与人工智能的和谐关系

人类与人工智能的和谐关系 打不过就加入吧,人类在人工智能为基础的智能机器面前 毫无优势可言,这方面的介绍 见我之前的文章《智能机器是世界上的新物种》 第一、人不要想着与机器对抗 人不要想着与机器竞争&#xff0c;或者是比赛&#xff0c;哪怕规则都是人类定的&#xf…

vscode中安装python的包

首先需要调出命令行。然后运行代码&#xff0c;找到你所需要的环境。 PS C:\Users\Administrator\AppData\Local\ESRI\conda\envs\arcgispro-env> conda env list # conda environments: #C:\ProgramData\Anaconda3 base * C:\Users\Administrator\.con…

搭子小程序:全新在线找搭子,满足社交

搭子作为一种新的社交方式&#xff0c;为大众带来的各种陪伴型的社交模式&#xff0c;不管是饭搭子、健身、遛狗、学习等&#xff0c;都可以找到适合自己的搭子。搭子主打各个领域的陪伴&#xff0c;双方都能够在社交相处中保持着边界感&#xff0c;不涉及情感纠葛等&#xff0…

vue 入门二

参考&#xff1a;丁丁的哔哩哔哩 11.组件基础 传递 props 父组件 <BlogPost title"My journey with Vue" />子组件 <script setup> defineProps([title]) </script><template><h4>{{ title }}</h4> </template>props第…