我遇到了一个问题,我存储为useState对象的数组只更新了它的最后一个元素.在下面的示例中,我们维护在Sub中更新的对象array.如果我们将这样的for循环更改为遍历arr中的所有元素,则arr中的最后一个元素将是更新的only个元素,这是一致的行为.

function Sub({arr, setArr}) {
  useEffect(() => {
    for(let i = 0; i < 2; i++){
      const arr_copy = arr.slice()
      arr_copy[i] = i
      setArr(arr_copy)
    }
  },[])
  return <p> </p>
}

export function App(props) {
  const [arr, setArr] = useState(["NOT CHANGED","NOT CHANGED"])


  return (
    <div className='App'>
      {arr.map((d) => <p> {d} </p>)}
      <Sub arr={arr} setArr = {setArr}/>
    </div>
  );
}

渲染:

NOT CHANGED

1

我在this个线程中try 了建议的答案--这些都是"向setFunction传递回调"、"首先将数组设置为空数组"、"创建深度副本"的不同变体,似乎都不起作用(所有这些都导致数组的最后一个元素的行为相同,唯一更改的元素).

作为进一步的说明,我在填充和更新字典而不是列表时得到了相同的useState({...})行为.

推荐答案

问题不在useState,它是你自己的代码.

在for循环内的第一行,您定义了一个新数组,因此每次它都是一个与原始数组具有相同值的新array.

让我用分步指南来解释这一点:

i = 0: 
1 - arr_copy = ["NOT CHANGED","NOT CHANGED"] 
2 - arr_copy = [0,"NOT CHANGED"]
3 - setArray([0,"NOT CHANGED"])

i = 1: 
1 - arr_copy = ["NOT CHANGED","NOT CHANGED"] 
2 - arr_copy = ["NOT CHANGED", 1]
3 - setArray(["NOT CHANGED", 1])

Reactjs相关问答推荐

NextJS(AppRouter)、Apollo(客户端),在根布局中使用ApolloProvider时出错

Reaction Axios多部分/表单-数据数组不工作

Reactjs中的chartjs和reaction-chartjs-2的问题

MUI 日期 Select 器 - 最小日期混乱

使用 MUI 菜单时添加新 html 元素时布局意外滚动跳转

错误:无法获取 RSC 负载.返回浏览器导航

拖放 - 将排序保存到数组字段

我收到Uncaught TypeError: props.handleSelect is not a function

如何使用 React 更改 Material UI 中 ButtonGroup 的 colored颜色 ?

React JS:如何判断用户使用的是浏览器 url 还是桌面 electron

如何检索包含动态段的未解析路径?

我刚刚部署了我的 Vite React 站点,但我的图标/图像没有部署

如何在 MUI 数据网格中的 renderCell 组件之间传递状态

谁能根据经验提供有关 useEffect 挂钩的更多信息

react-markdown 不渲染 Markdown

为什么此代码中的 useState 不更新(文本更新但 id 不更新)?

如何使用 UseState 正确测试组件

如何在 React 中的 Material Ui 多选中设置默认值?

react 路由dom没有路由匹配位置错误/在路由中制作组件

在 React 中访问作为 prop 传递的状态变量