首页 > 其他分享 >更新 state 中的数组

更新 state 中的数组

时间:2024-10-30 09:21:31浏览次数:3  
标签:... map 元素 更新 state 数组 nextList

同对象一样,当你想要更新存储于 state 中的数组时,你需要创建一个新的数组(或者创建一份已有数组的拷贝值),并使用新数组设置 state。

在没有 mutation 的前提下更新数组

每次要更新一个数组时,你需要把一个新的数组传入 state 的 setting 方法中。为此,你可以通过使用像 filter()map() 这样不会直接修改原始值的方法,从原始数组生成一个新的数组。然后你就可以将 state 设置为这个新生成的数组。

避免使用 (会改变原始数组) 推荐使用 (会返回一个新数组)
添加元素 push,unshift concat,[...arr] 展开语法
删除元素 pop,shift,splice filter,slice
替换元素 splice,arr[i] = ... 赋值 map
排序 reverse,sort 先将数组复制一份

或者,你可以使用 Immer ,这样你便可以使用表格中的所有方法了。

向数组中添加元素

应该创建一个 新 数组,其包含了原始数组的所有元素 以及 一个在末尾的新元素。
最简单的一种就是使用 ... 数组展开 语法

setArtists( // 替换 state
  [ // 是通过传入一个新数组实现的
    ...artists, // 新数组包含原数组的所有元素
    { id: nextId++, name: name } // 并在末尾添加了一个新的元素
  ]
);

数组展开运算符还允许你把新添加的元素放在原始的 ...artists 之前

setArtists([
  { id: nextId++, name: name },
  ...artists // 将原数组中的元素放在末尾
]);

... 数组展开就可以完成 push() 和 unshift() 的工作,将新元素添加到数组的末尾和开头。

从数组中删除元素

setArtists(
  artists.filter(a => a.id !== artist.id)
);

filter 并不会改变原始数组

转换数组

如果你想改变数组中的某些或全部元素,你可以用 map() 创建一个新数组。你传入 map 的函数决定了要根据每个元素的值或索引(或二者都要)对元素做何处理。

替换数组中的元素

要替换一个元素,请使用 map 创建一个新数组。在你的 map 回调里,第二个参数是元素的索引。使用索引来判断最终是返回原始的元素(即回调的第一个参数)还是替换成其他值:

向数组中插入元素

有时,你也许想向数组特定位置插入一个元素,这个位置既不在数组开头,也不在末尾。为此,你可以将数组展开运算符 ...slice() 方法一起使用。slice() 方法让你从数组中切出“一片”。为了将元素插入数组,你需要先展开原数组在插入点之前的切片,然后插入新元素,最后展开原数组中剩下的部分。


  function handleClick() {
    const insertAt = 1; // 可能是任何索引
    const nextArtists = [
      // 插入点之前的元素:
      ...artists.slice(0, insertAt),
      // 新的元素:
      { id: nextId++, name: name },
      // 插入点之后的元素:
      ...artists.slice(insertAt)
    ];
    setArtists(nextArtists);
    setName('');
  }

其他改变数组的情况

总会有一些事,是你仅仅依靠展开运算符和 map() 或者 filter() 等不会直接修改原值的方法所无法做到的。例如,你可能想翻转数组,或是对数组排序。而 JavaScript 中的 reverse() 和 sort() 方法会改变原数组,所以你无法直接使用它们。

然而,你可以先拷贝这个数组,再改变这个拷贝后的值。

  function handleClick() {
    const nextList = [...list];
    nextList.reverse();
    setList(nextList);
  }

然而,即使你拷贝了数组,你还是不能直接修改其内部的元素。这是因为数组的拷贝是浅拷贝——新的数组中依然保留了与原始数组相同的元素。因此,如果你修改了拷贝数组内部的某个对象,其实你正在直接修改当前的 state。举个例子,像下面的代码就会带来问题。

const nextList = [...list];
nextList[0].seen = true; // 问题:直接修改了 list[0] 的值
setList(nextList);

虽然 nextListlist 是两个不同的数组,nextList[0]list[0] 却指向了同一个对象。

更新数组内部的对象

标签:...,map,元素,更新,state,数组,nextList
From: https://www.cnblogs.com/duixue/p/18515049

相关文章

  • javascript 数组 filter
    javascript数组filter在JavaScript中,filter方法被用于创建一个新数组,该数组包含通过提供的函数实现的测试的所有元素。解法1:基本使用方法letnumbers=[4,9,16,25,29];letnewNumbers=numbers.filter(num=>num>10);console.log(newNumbers);//......
  • [一直更新中]一句话题解
    目录一句话题解2024.10.29AT_abc290_fAT_arc156_c2024.10.30P5749[IOI2019]排列鞋子AT_abc285_e一句话题解不能什么题都随便写写就过了,留点印象好一点。一直更新。2024.10.29AT_abc290_f组合数数。满足树的形态要有\(\sumdeg_i=2n-2\)。考虑目前有\(k\)个儿子节点,直径......
  • [错误代码] SQLSTATE[HY000] [1045] Access denied for user 'cs2021'@'localhost' (u
    错误分析错误代码:SQLSTATE[HY000][1045]Accessdeniedforuser'cs2021'@'localhost'(usingpassword:YES)错误类型:数据库连接错误错误原因:用户名或密码错误。数据库用户没有权限从 localhost 连接。MySQL服务未启动或配置问题。解决方案检查用户名和密码......
  • 易优cms系统报错SQLSTATE[42S22]: Column not found: 1054 Unknown column 'groupid'
    .检查数据库表结构确认表结构:首先确认相关表中是否存在 groupid 列。  DESCRIBE表名;将 表名 替换为实际的表名,例如 eyou_member 或 eyou_admin。2.修改查询语句检查查询语句:如果 groupid 列确实不存在,需要修改相关的查询语句。找到引发错误的查询......
  • JS-数组、函数、类与对象
    JS进阶数组数组可以存放任意类型的元素letarr=['小胖',12,true,28.9];console.log(arr,arr.length);增arr[4]='newValue';改arr[4]='changedValue';删不会改变数组的长度,使用undefined赋值deletearr[4];查console.log(arr[4]);//undefined多......
  • 深入浅出:SpringBoot启动流程源码分析(持续更新中......)最新日期:2024年10月29日
    Hello,大家好,我是此林。今天来深入底层讲一讲SpringBoot是如何启动的,也就是我们单击运行SpringBoot启动类,它底层发生了什么?SpringBoot启动类很简单,只有一行代码。我们点进run()方法。我们发现,它底层其实进行了两步操作。第一步是new出一个SpringApplication对象,第二个是......
  • 203. 长度最小的子数组
    题目看了卡哥的视频后,写了如下代码:classSolution{public:intminSubArrayLen(inttarget,vector<int>&nums){intresult=INT32_MAX;intsum=0;inti=0,j=0;for(j=0;j<nums.size();j++){......
  • 977. 有序数组的平方
    题目看了卡哥的讲解视频后,写了如下代码:classSolution{public:vector<int>sortedSquares(vector<int>&nums){vector<int>result;intk=nums.size()-1;inti=0,j=k;while(i<=j){......
  • 复杂度分析,数据结构的数组与链表
    复杂度分析,数据结构的数组与链表参考书籍:Hello算法目录复杂度分析,数据结构的数组与链表复杂度分析时间复杂度空间复杂度数据结构数组与链表数组链表列表复杂度分析复杂度分析是用来判断一个算法效率的手段,执行时所需的时间和空间资源则是正好对应时间和空间复杂度。考虑到执......
  • 袋鼠云产品功能更新报告12期|让数据资产管理更高效
    本期,我们更新和优化了数据资产平台相关功能,为您提供更高效的产品能力。以下为第12期袋鼠云产品功能更新报告,请继续阅读。一、【元数据】重点更新|01元数据管理优化,支持配置表生命周期之前系统中缺少一个可以基于数据源和数据库维度,批量配置数据表生命周期的入口,导致用户在处理......