【发布时间】:2021-05-26 07:17:59
【问题描述】:
让我开始说我知道 setState 是异步的,这不是我遇到的问题(我猜)!
我有一个表,我将每一行存储在一个数组中,定义为:
const [rows, setRows] = useState([]);
我将表格渲染为:
rows.map(r => {
if(r.prop == 1) {
return (
<div key={r.position} onClick={e => AddRow(r.position)}>{r.label} </div>
)
}
})
AddRow 函数只是在指定索引 (r.position) 处添加一行,并相应地移动和更新所有行。当然,我使用 setRows([...newRows]); 更新行;
只要我在底部添加一行,它就可以完美运行。但是,例如,如果我在位置 2 添加一行并且行数为 10,则行(数组)仅包含 2 行,就像添加第二行时一样。第 3 行、第 4 行也一样.....就像 AddRow 函数已为每一行复制,并在复制时使用“行”的状态。
我尝试删除 if 语句,但问题仍然存在。我也尝试使用假 id 作为密钥,但问题仍然存在。
我感觉我错过了一些非常简单的东西,有什么想法吗?
非常感谢
供参考,这是 AddRow 函数
const AddTile = (atPosition) => {
let newPosition = atPosition + 1;
let newRow = {
position: newPosition,
label: 'something',
prop: 1
}
let tmp = [];
let counter = 0;
let added = false;
for(let t of rows) {
if(newPosition == counter) {
tmp.push(newRow);
counter++;
added = true;
}
t.position = counter;
tmp.push(t);
counter++;
}
if(!added) {
tmp.push(newTile);
}
setRows([...tmp]);
}
【问题讨论】:
-
其实
setState不是async,是一个完全同步的函数。 React 状态更新是异步的,即它们被排队和异步处理。addTile和addRow的功能一样吗? -
这就是你要找的 - stackoverflow.com/questions/45147420/…
-
另外,如果你在 Array 中插入一些东西,我们可以使用
array index来跟踪位置。我不认为我们明确需要position属性。
标签: reactjs