【发布时间】:2022-11-11 12:22:11
【问题描述】:
我在使 useState 行为正确时遇到问题。
我想隐藏或显示依赖于先前状态的计算的子元素。
当我这样运行它时,它会导致无限重新渲染:
export function PersonWidget(props: Props) {
const store = useTableState();
const [positionsVorschlagVisible, setPositionsVorschlagVisible] = React.useState(false);
var positionsVorschlag = calculatePositionsvorschlag(
convertTokenToDTOToken(store.previousTokens),
convertTokenToDTOToken(store.tokens),
props.tokenId,
positionsVorschlagVisible.valueOf()
);
// this causes infinite loop
setPositionsVorschlagVisible(visible =>
(positionsVorschlagVisible && positionsVorschlag.showAction === showAction.keep) || positionsVorschlag.showAction === showAction.show);
return (
<div style={styles}>
{positionsVorschlagVisible &&
<PositionsVorschlag />
}
<Rente />
</div>
)
}
所以我尝试在useEffect 中设置状态,但在初始渲染后不再调用它:
// not called anymore after initial rendering
useEffect(() => {
setPositionsVorschlagVisible(visible =>
(positionsVorschlagVisible && positionsVorschlag.showAction === showAction.keep) || positionsVorschlag.showAction === showAction.show);
}, [positionsVorschlagVisible]);
为什么即使positionsVorschlagVisible 已更改,组件也不重新渲染?我使用useEffect 或useState 错了吗?
顺便说一句,(我不知道这是否重要),父组件在 mobx 商店中渲染那些 PersonWidgets 依赖于变化:
export const Screen = observer((): React.ReactElement => {
const store = useTableState();
var personTokens = store.tokens.filter(token => token.type === 'person');
return (<div style={ScreenStyles}>
{personTokens.map((personToken => {
return (
<div key={personToken.id} style={{ position: 'absolute', top: personToken.center.y, left: personToken.center.x }}>
<PersonWidget tokenId={personToken.id}/>
</div>
)
}))}
</div>)
});
【问题讨论】:
标签: reactjs