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. 仅修改数组时拷贝,避免无意义性能开销。
相关推荐
不可求~7 小时前
多模型路由怎么落地:把任务分流写进项目的最小实现
java·前端·数据库
AC赳赳老秦10 小时前
公开图片 OCR 数据提取:OpenClaw 合规采集公开信息图,识别文字与表格并转化为结构化数据
java·大数据·前端·数据库·python·php·openclaw
谢慧琼10 小时前
2026零基础做企业网站,低成本搭建官方网站
服务器·前端·javascript
weixin_4316004411 小时前
前端数据埋点(1):一次点击如何变成一条埋点
前端·js·数据埋点
IT_陈寒12 小时前
Python线程池吞了异常还不告诉我,这谁顶得住啊
前端·人工智能·后端
计算机魔术师12 小时前
同样是AI辅助建造,为什么有的游戏三个月就烂尾了?
前端
用户9210802628612 小时前
0. 做 Agent 产品,前端 AI 组件框架怎么选?
前端
拾年27513 小时前
React Hooks 进阶篇:useMemo / useCallback / useReducer / useImperativeHandle,用「算账 +
前端·javascript·react.js
Jackson__13 小时前
面试官:如何在老项目中使用新框架,并实现通信?
前端·javascript·面试
拾年27513 小时前
React Hooks 保姆级教程:把组件想象成失忆的打工人,4 个 Hook 带你原地起飞
前端·javascript·react.js