【发布时间】:2020-07-21 14:38:50
【问题描述】:
我有一个应用程序,用户将在其中单击应用程序的各个部分,这将在右侧的抽屉中显示某种配置选项。
我为此得到的解决方案是将要显示的任何内容存储在上下文中。这样,抽屉只需要从上下文中检索其内容,并且需要设置内容的任何部分都可以直接通过上下文进行设置。
这是CodeSandbox demonstrating this。
键码sn-ps:
const MainContent = () => {
const items = ["foo", "bar", "biz"];
const { setContent } = useContext(DrawerContentContext);
/**
* Note that in the real world, these components could exist at any level of nesting
*/
return (
<Fragment>
{items.map((v, i) => (
<Button
key={i}
onClick={() => {
setContent(<div>{v}</div>);
}}
>
{v}
</Button>
))}
</Fragment>
);
};
const MyDrawer = () => {
const classes = useStyles();
const { content } = useContext(DrawerContentContext);
return (
<Drawer
anchor="right"
open={true}
variant="persistent"
classes={{ paper: classes.drawer }}
>
draw content
<hr />
{content ? content : "empty"}
</Drawer>
);
};
export default function SimplePopover() {
const [drawContent, setDrawerContent] = React.useState(null);
return (
<div>
<DrawerContentContext.Provider
value={{
content: drawContent,
setContent: setDrawerContent
}}
>
<MainContent />
<MyDrawer />
</DrawerContentContext.Provider>
</div>
);
}
我的问题是 - 这是对上下文的适当使用,还是这种解决方案可能会遇到渲染/虚拟 dom 等问题?
有没有更整洁的方法来做到这一点? (即自定义钩子?但请记住,一些想要进行设置的组件可能不是功能组件)。
【问题讨论】:
-
为什么不能将不同的值存储为上下文数据并根据这些值有条件地在 Drawer 组件中呈现 UI?
-
@rzwnahmd - 因为实际上我想放在抽屉里的东西不仅仅是“数据”。它们可能是具有自定义交互等的不同形式。
标签: reactjs react-context