【发布时间】:2021-04-14 05:34:49
【问题描述】:
我有一个子组件,它位于父组件的循环中。当其中一个子组件正在更新父组件的状态时,它会重新渲染所有子组件,因为它是循环的。如何避免每次迭代的重新渲染。
function Parent() {
const [selectedChild, setSelectedChild] = useState([]);
const onChangeHandle = (event, id) => {
const checked = event.target.checked;
let updatedArray = [...selectedChild];
if(checked){
if(!selectedChild.includes(id)){
updatedArray.push(id);
}
}
else{
var index = updatedArray.indexOf(id)
if (index !== -1) {
updatedArray.splice(index, 1);
}
}
setSelectedChild(updatedArray);
}
const dummy = (id) => {
return selectedChild.includes(id);
}
return (
<div>
<table>
<tbody>
{[1,2,3].map((value, index) => {
return (
<Child
key={index}
index={index}
value={value}
handle={onChangeHandle}
isSelected={dummy}
/>
)
})}
</tbody>
</table>
<div>
{selectedChild}
</div>
</div>)
}
function Child({index, value, handle, isSelected }) {
console.log('rendering')
return (
<tr>
<td>
<input
type="checkbox"
checked={isSelected(index)}
onChange={(event) => handle(event, index)}/>
</td>
<td>hello {index} {value}</td>
</tr>
)
}
export default function App() {
return (
<div className="App">
<Parent />
</div>
);
}
当前行为:
在上面的代码中,当我单击其中一个子组件中的复选框时,它正在更新父组件状态(selectedChild)。所以循环正在执行,所有子项(所有表行)都在重新渲染。
预期行为: 只有特定的行需要重新渲染
【问题讨论】:
-
一方面,尝试使用唯一的键属性值rather than array indicies。这绝对可以避免一些重新渲染,即使这不是您的具体问题。
-
我不会投票关闭这个重复的,但this answer your question?
标签: javascript reactjs react-hooks react-usememo