reactjs - React : 切换 PopUp 会重新渲染整个组件
问题描述
我仍然在弄清楚 React 的来龙去脉,所以请在这里耐心等待。
我使用 MaterialUI 制作了一个组件,该组件包含一个网格和一个 PopOver。一个粗略的模型可能如下所示:
export const Overblik = () => {
const [filterAnchorEl, setFilterAnchorEl] = useState<HTMLButtonElement | null>(null);
return (
<div>
<IconButton onClick={handleFilterClick}></IconButton>
<Popover
anchorEl={filterAnchorEl}
open={Boolean(filterAnchorEl)}
onClose={handleFilterClose}
anchorOrigin={{
vertical: 'bottom',
horizontal: 'left'
}}><div>stuff</div></Popover>
<Grid>[somelongListGoesHere]</Grid>
</div>
);
}
现在的问题是,当我切换 filterAnchorEl 状态以显示弹出框时,标有的网格[somelongListGoesHere]
也会重新渲染,从而使弹出框看起来很慢。我认为我的方法一定有问题,但是关于如何更好地处理这个问题有什么建议吗?
解决方案
尝试将网格移动到另一个组件
const MyGrid = () => (<Grid>[somelongListGoesHere]</Grid>)
然后在你的组件中渲染它
<IconButton onClick={handleFilterClick}></IconButton>
<Popover ... />
<MyGrid />
如果组件没有 props 更改,MyGrid
则不会重新渲染。你也可以React.memo
像这样缓存它:
const MyGrid = React.memo(() => (<Grid>[somelongListGoesHere]</Grid>))
推荐阅读
- matlab - MATLAB 中有没有办法判断一个名称是否是可调用的名称?
- reactjs - 如何使用没有任何包的钩子向功能组件添加无限滚动?
- javascript - 从 Reducer 中的回调返回数据
- cmake - 使用 cmake 在源文件名之前添加一个编译选项
- mysql - MAX(date) 在 mysql 中没有给出正确的答案
- caching - 用户浏览器是否缓存 CDN 托管的静态内容文件
- java - 接受 SDK 许可时出现“java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema”
- python - 如何使用 json 保存机器人的活动状态?
- c# - 使用 NoSql 数据库的本地实例来存储用户设置(Windows 桌面)
- linux - 如何通过 bash 脚本直接在不是最活跃的工作区的工作区上打开程序