reactjs - React Components - 避免重新渲染
问题描述
新的反应......我有一个状态为数组的组件。在渲染函数中,它将数组映射到一组渲染表单组件(通常是选择)的子组件。如果用户更改了其中一个选择,则子进程调用 onChange,它运行一个处理程序以通过 useState() 提供的函数更新数组。问题 - 然后重新渲染每个子组件。有没有办法避免这种情况?React.memo 似乎没有帮助,因为同一个 Child 组件的许多实例具有不同的 props。
大致:
function Parent() {
const [ arr, setArr] = useState( <some big array> );
let handleChange = e => {
// logic to figure out what needs to be updated
setArr(<new array>);
}
return (
{
arr.map( (el, i) =>
<Child prop1={el} onChange={handleChange}>
)
}
)
}
解决方案
为了防止重新渲染,React.memo
这是正确的方法,但是您需要记住该handleChange
函数,否则在重新渲染期间,每个子组件将引用一个onChange
与先前重新渲染不同的函数,因此无法停止重新渲染-渲染
function Parent() {
const [ arr, setArr] = useState( <some big array> );
let handleChange = useCallback(e => {
// logic to figure out what needs to be updated
setArr(<new array>);
// Use functional callback to update state instead of taking it from closure
}, []);
return (
{
arr.map( (el, i) =>
<Child prop1={el} onChange={handleChange}>
)
}
)
}
const Child = React.memo((props) => {
// Child component logic
})
推荐阅读
- ios - How to fix issue regarding pkpass not working after dragging to ios simulator?
- rust - How to solve "returns a value referencing data owned by the current function" error in Rust?
- mongodb - MongoDB,在组计数之后再做一次计数
- python - 如何添加变量
- android - 选择与 TouchableOpacity 相同时如何自定义按钮或视图?
- django - 上传文件时,有什么方法可以绕过托管我的 Django 站点的服务器,而是立即上传到 S3?
- php - 如何用PHP中的html标签替换括号中的一些单词?
- visual-studio-2017 - Visual Studio Q# IDE 中的自动代码完成?
- postgresql - 如何创建访问 CTE 表内 IF 语句的 PostgreSQL UPSERT 函数?
- apache-kafka - Kafka Stream:最终结果立即发出?