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. 仅修改数组时拷贝,避免无意义性能开销。
相关推荐
傅里叶2 小时前
Flutter开发的app,实现Google 登录
前端·flutter
胖橘2 小时前
适用于Vue3的高集成度文件预览组件,支持多种类型的文件
前端·vue.js·开源
我叫黑大帅2 小时前
🚀 JS 最常用的性能优化 防抖和节流
前端·javascript·面试
啊丫丫2 小时前
【深入浅出地学习Vue】——vue2
前端·vue.js
求知若饥2 小时前
webpage-channel 让不同页面通信像组件通信一样简便
前端·typescript·node.js
图扑软件2 小时前
图扑 HT 帧动画 | 3D 动态渲染设计与实现
前端·javascript·3d·动画·数字孪生
终端鹿2 小时前
Pinia 与 Vue Router 权限控制实战(衔接Pinia基础篇)
前端·javascript·vue.js
啥咕啦呛2 小时前
3个月前端转全栈计划
前端
BradyC3 小时前
laya编译内存溢出问题
前端