React---数组浅拷贝之slice的使用

前言

React 的核心原则之一是:状态(state)是不可变的(immutable) ,你不能直接修改 useState 返回的状态值。

一、 为什么必须用 slice ?

React状态不可直接修改!slice这里直接调用,会生成新的数组(引用不同),react会检测到状态变化并渲染;但是直接通过数组的索引去修改的话,不会触发react的更新机制;

这里是关于react需要拷贝的内容汇总https://blog.csdn.net/COCOLI_BK/article/details/159386310

  1. 一维数组
javascript 复制代码
import { useState } from 'react';
function Demo() {
  const [list, setList] = useState([1,2,3]);
  const handleUpdate = () => {
    const newList = list.slice(); // 创建浅拷贝(新数组)
    newList[0] = 100; // 修改新数组
    setList(newList); // 更新状态触发重渲染
  };
  return (
    <div>
      <div>{list.join(',')}</div>
      <button onClick={handleUpdate}>更新</button>
    </div>
  );
}
  1. 多维数组
javascript 复制代码
// 对象数组
function ObjArrDemo() {
  const [users, setUsers] = useState([{id:1, name:'张三'}]);
  const handleUpdate = () => {
    const newUsers = users.slice();
    newUsers[0] = { ...newUsers[0], name:'李四' }; // 内层对象拷贝
    setUsers(newUsers);
  };
  return <button onClick={handleUpdate}>改名字</button>;
}

// 多维数组
function MultiArrDemo() {
  const [arr, setArr] = useState([[1,2], [3,4]]);
  const handleUpdate = () => {
    const newArr = arr.slice();
    newArr[0] = [...newArr[0]]; // 内层数组拷贝
    newArr[0][1] = 200;
    setArr(newArr);
  };
  return <button onClick={handleUpdate}>改数值</button>;
}

二、slice () 替代方法

javascript 复制代码
// 1. 扩展运算符
const newls = [...list]

// 2. Array.from
const newList = Array.from(list);

// 3. map(适合修改/过滤)
const newList = list.map(item => item*2)

三、注意事项

  1. 浅拷贝仅覆盖第一层,多维 / 对象数组需拷贝内层数据;
  2. 优先用展开运算符 [...arr],语义更清晰;
  3. 仅修改数组时拷贝,避免无意义性能开销。
相关推荐
lpfasd1231 小时前
node-sass 停止维护!老项目迁移 Dart Sass 完整教程
前端·rust·sass
Data analyse4563 小时前
rnweb 回放数据量太大怎么办?分片存储与断点续传的实现思路
前端·网络·算法·数据分析
xiaogai_gai4 小时前
金蝶收料通知单查询策略实战教程:从源系统拉取到中间层落地的完整路径
java·前端·数据库
环境栈笔记4 小时前
指纹浏览器 WebRTC 怎么设置?从 ICE 候选、代理出口到功能验证
前端·人工智能·后端·自动化
赵大仁5 小时前
官网性能优化实战:LCP 3.2s → 2.1s、CLS 0.107 → 0,以及被我推翻的 6 个判断
前端·性能优化·cls·lcp·core web vitals
xiancai_xianyu5 小时前
Text2SQL落地生产库前,SQL要过哪三道闸
前端·数据库·sql·sql注入·text2sql·ai agent开发·企业级ai框架
小羊没烦恼!5 小时前
T-SQL查询进阶--理解SQL SERVER中的分区表
服务器·开发语言·前端·javascript·html
史瓦辛格5 小时前
给 DeepSeek Harness 写费用插件:把「这次会话花了多少钱」算准
前端·deepseek
星光不问赶路人5 小时前
Vue 3 + TypeScript 中 enum 的使用实践
前端·vue.js
鸥梨菌Honevid5 小时前
UVM 中 REQ 和 RSP 类型详解:从通信模型到 item_done 与 put_response
java·前端·servlet