reactjs - 2个子组件无限重新渲染
问题描述
我有 2 个组件,我知道问题是它们无限地相互重新渲染,但我该如何以不同的方式做到这一点?渲染“Subs”组件时,它会渲染范围表组件。渲染范围表时,我需要重新渲染 Subs 组件,因为它形成了一种弹出窗口。我还能怎么做呢?
子组件 -
const Subs = connect(
mapStateToProps,
mapDispatchToProps
)((props) => {
const { project, section, bid, bidId } = props;
return (
<>
<div>other things</div>
<Scopesheet
bidId={bidId}
bid={bid}
section={section}
project={project}
/>
</>
)
})
export default Subs;
范围表组件 -
function Scopesheet(props) {
const classes = useStyles();
const canvasRef = useRef();
const canvasWrapper = useRef();
const {
section,
bid,
bidId,
project,
} = props;
const subUI = useMemo(() => {
const subsArray = [];
subsArray.push(
<Subs key={bidId} section={section} bid={bid} project={project} />
);
return (<div>{subArray}</div>);
}, [section, bid, project, bidId]);
return (
<>
<div ref={canvasWrapper} className={classes.scopesheetCanvasWrapper}>
{subUI}
<canvas style={{ float: 'right' }} ref={canvasRef}></canvas>
</div>
</>
);
}
export default Scopesheet;
我正在将重要信息从 Subs 传递到 Scopesheet,例如我需要从中执行不同操作的 bidId 和 props,但在 scopesheet 中我需要能够再次呈现 Subs 组件以形成弹出窗口。有没有办法我可以以不同的方式做到这一点?
解决方案
将组件作为彼此的子组件只会给您带来这种性能。我强烈建议你使用回调道具的形式来更新你的subs
. 并从 Scopesheet 组件中删除 useMemo 以及 subs。现在像这样在 subs 中向 Scopesheet 添加一个新道具......
<Scopesheet
bidId={bidId}
bid={bid}
section={section}
project={project}
cb={cbFunction}
/>
并且 cbFunction 应该需要这些参数
function cbFunction(bidId,bid,section,project) {
// update your state through here
}
建议:考虑使用useState
钩子或useReducer
管理您的状态。
更新:
我很难理解 cbFunction 的用途到底是什么。我没有更新任何一个组件的状态,所以我不确定你想说什么。有没有一种方法可以只在 subs 内渲染 scopesheet 组件一次?基本上,有一个包含名为 subs 的信息的容器,在 subs 中我呈现范围表,在范围表中我有按钮,单击这些按钮会导致弹出窗口,然后我需要在弹出窗口中再次呈现 subs 容器,但这会导致一个无限循环。抱歉,如果我的问题不清楚。
- 有没有一种方法可以只在 subs 内渲染 scopesheet 组件一次?
如果 subs 中的信息/数据是可变的,它仍然会导致范围表重新渲染,具体取决于您处理数据的方式。您可以检查useRef
是否不想更改数据以重新呈现您的范围表。
- 在范围表中我有按钮,单击这些按钮会导致弹出窗口,然后我需要在弹出窗口中再次呈现 subs 容器,但这会导致无限循环。
如前所述,如果您再次将子容器作为范围表的子容器,则无限循环是不可避免的。一个简单的解决方法是使用material-ui modal。设置一个新的 DOM_Node 并使用一些纯 js 和 css 样式为您的弹出窗口。你可以参考这篇文章。如果我的回答仍然不够清楚,您可以尝试提供更多的实现代码片段,并更连贯地说明您想要实现的目标。其他 stachoverflowers 或许能给出答案。
快乐的编码...
推荐阅读
- cmake - 何时使用 CMAKE_CURRENT_LIST_DIR?
- linq - 使用 ExpandoObject 时表达式树无法正确评估
- git - 让 git 从命令行请求凭据
- amazon-redshift - 在 REDSHIFT 中自动拒绝 Redshift 访问
- linux - msmtp 无法通过 OVH SMTP 将邮件发送到根地址
- reactjs - Next.js + Redux:在 getInitialProps 中获取数据操作完成之前加载一个页面
- python - 如何在训练期间保持模型固定?
- android - MediaStore.Audio.Media.DURATION 列现在仅在 API 29 上可用?
- r - 根据数据集的条件设置颜色和框(箱线图)
- ssis - SSIS - 以编程方式终止活动的 OLEDB 连接