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都没有变化
作用域链原理所致,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);
在 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。 二次函数如下: