我在屏幕底部有一个门户,只是为了提供信息。它显示在redux状态,并且此组件处于App
级别。问题是如果此门户组件更改了其状态,则会重新呈现整个父组件。在我的示例中,如果有人关闭了门户。下面是我如何在单击时关闭门户。
dispatch({
type: 'close-portal',
payload: {
portalState: { display: false },
},
});
应用程序组件
const isPortalOpen = useSelector((state) => state.user.portalState.display);
<Switch>
<Route path='/login' component={LoginPage} exact />
<Route path='/error' component={PermissionErrorPage} exact />
</Switch>
{isPortalOpen && <InformativeMessage />}
现在,如果我在Login
页面上并关闭门户,则整个页面将重新呈现。
备选
我从App
组件中删除了条件渲染,并将其移到了portal
组件本身中。
应用程序组件
<Switch>
<Route path='/login' component={LoginPage} exact />
<Route path='/error' component={PermissionErrorPage} exact />
</Switch>
<InformativeMessage />
门户组件
return (
<>
{isPortalOpen ? (
<EuiPortal>
<EuiBottomBar
style={{
backgroundColor: showUnsavedWarningPortal ? "red" : "",
padding: "20px",
}}
>
<EuiFlexItem
style={{
display: "flex",
flexDirection: "row",
alignItems: "center",
}}
>
<EuiFlexItem>
<EuiButtonIcon
onClick={closePortal}
color="ghost"
iconType="crossInACircleFilled"
/>
</EuiFlexItem>
<EuiFlexItem style={{ marginLeft: "10px" }}>
<EuiText>{message}</EuiText>
</EuiFlexItem>
</EuiFlexItem>
</EuiBottomBar>
</EuiPortal>
) : null}
</>
);
怀疑
现在,如果门户关闭,但此组件没有完全删除,则返回null
。如果打开开发工具并转到组件选项卡,我可以看到门户组件。当然,里面什么都没有,但在整个应用程序运行期间都使用此组件是否是一种好做法?
2条答案
按热度按时间t1qtbnec1#
返回
null
没有问题;它也是react官方推荐的,并且在react中被指定为有效的节点类型;如您所见,React的@types/react/index.d.ts
类型定义文件:0kjbasz62#
我会说这没有什么错,而且我已经看到这种技术被大量使用。更可取的是,我更喜欢第一种方法-它将逻辑放在App组件中,InfoMessage只需要关心它的表示-这是一种很好的分离关注点的方法