当前位置: 首页 > 知识库问答 >
问题:

react.js - react set函数修改二维数组状态问题?

邢嘉祯
2023-11-22

react set函数修改二维数组状态问题

const [rangIds,setRangIds]= useState([] as any[])const rangChange = (values:any,indA:number,indB:number)=>{  console.log(values)  console.log(rangIds)  let arr = [...rangIds]  arr[ind]=[...values]  console.log(arr) setRangIds([...arrs]) console.log(rangIds)}

一直到arr都是符合预期的,但是setRangIds执行后,每次打印rangIds都没有变化

共有2个答案

拓拔高畅
2023-11-22

作用域链原理所致,setRangIds函数体与 rangIds 不在同一个作用域,所以调用 setRangIds 是不可能给这个作用域里的rangIds重新赋值的。

注意是“重新赋值”,而不是“修改其属性”,这两者是不一样的:

let a = {p: 100};a = {p: 120};

��这种是“重新赋值”;

let a = {p: 100};a.p = 120;

��这种是“修改其属性”。

更不要说rangIds还是一个以const关键字声明的常量,JS 中常量是不允许重复新赋值的。

楼上说的延迟执行并不是主因,例如下面的代码,使用 setTimeout 消除了延迟执行的影响,但打印的仍会是修改前的:

  console.log(arr);  setRangIds([...arrs]);  setTimeout(() => {    console.log(rangIds);  }, 1000);
甘永春
2023-11-22

在 React 中使用 useState 时,调用状态更新函数 setXxx 并不会立即使状态值 xxx 更新,而是会将更新操作加入到 React 的更新队列中。这是因为 React 会对多个状态更新进行批处理,然后一次性地触发重新渲染。

因此,如果你在调用 setXxx 后立即访问状态值 xxx,获取到的是更新之前的旧值,而不是最新的值。

你把 console.log(rangIds)放在 rangChange函数外面打印。 set后组件重新执行 打印的rangIds就是最新的值了

 类似资料:
  • 我想在数组的末尾添加一个元素,这是正确的方法吗? 我担心使用修改阵列可能会导致问题-安全吗? 另一种方法是复制数组,然后ing这似乎是浪费。

  • 问题内容: 我想在数组的末尾添加一个元素,这是正确的方法吗? 我担心如果就地修改阵列可能会造成麻烦-是否安全? 制作数组副本的另一种选择似乎是浪费的。 问题答案: 该阵营的文档说: 将此this.state视为不可变的。 您将直接更改状态,即使您此后再次“重置”状态,也有可能导致易于出错的代码。F.ex,它可能导致某些生命周期方法(如不会触发)。 在更高版本的React中,建议的方法是在修改状态以

  • react 在 A 函数设置了state 然后调用 B函数,B函数中使用了state,但直接获取state不是最新值。 使用Effect和通过函数参数传递来解决,感觉都不优雅,大佬们有没有比较好的经验?

  • 问题内容: 我想在数组的末尾添加一个元素,这是正确的方法吗? 我担心如果就地修改阵列可能会造成麻烦-是否安全? 制作数组副本的另一种选择似乎是浪费的。 问题答案: 该阵营的文档说: 将此this.state视为不可变的。 您将直接更改状态,即使您此后再次“重置”状态,也有可能导致易于出错的代码。F.ex,这可能会导致某些生命周期方法(如不会触发)。 在更高版本的React中,建议的方法是在修改状态

  • 受到这个问题的启发。我创建了这个函数: 不幸的是,它不起作用。为什么?是否可以用C返回一个指向二维数组的指针,并使用上面的方法保留[][]符号?如果不是,原因何在?我在这里遗漏了什么? 我知道通过创建外部数组,通过引用将其传递给函数,可以解决这个问题。但是它有点难看,我想把所有的东西都封装在一个函数中。

  • 我正在编写一个计算和绘制抛物线的小程序。但我在程序中有一小部分需要计算valuetable。 二次函数如下: