reactjs - 在 React 中的 TypeScript 中打开和关闭对话框的状态
问题描述
我使用了一个材质-ui Dialog。由于我缺乏能力,该对话框无法重复打开和关闭。关闭对话框后,它没有再次打开记录器。我应该如何修复我的代码?我正在使用 React 和 Redux 。函数 OpenPepsi 在 Container 中。can 来自 Promise 对象。
function MainPage(props: Material) {
return (
<React.Fragment>
<Link variant="h3" onClick={props.OpenPepsi}>
OpenPepsiDialog
</Link>
<br />
{props.can && (
<PepsiDialog
can ={props.can}
isOpen={!!props.can}
/>
)}
function PepsiDialog(props: {
c: can;
isOpen: boolean;
}) {
const [open, setOpen] = React.useState(props.isOpen);
const handleClose = () => {
setOpen(false);
};
return (
<Dialog open={open} onClose={handleClose}>
<React.Fragment>{c}</React.Fragment>
);
行动
export const OPEN_PEPSI = () => async (dispatch: Dispatch) => {
const can = await getPepsi(FOO);
dispatch(OPEN_PEPSI_NOTIFY(can));
};
解决方案
这条线导致不正确的行为
const [open, setOpen] = React.useState(props.isOpen);
似乎您正在props.isOpen
父级中更新并希望open
在对话框中更新。但这行不通。的参数useState
用于初始化状态,但不会在后续调用组件时更改它(直到它安装)。open
所以要根据你更新变量props.isOpen
应该添加useEffect
如下
useEffect (() => setOpen(props.isOpen), [props.isOpen])
这种方式open
将根据isOpen
变化进行更新。
但是这种简化形式有一个缺点。can
只有在 Redux 中更改为false
,然后再次更改为 时,对话框才会重新打开true
。所以也许你想将关闭状态传播回 Redux 存储。在这种情况下,连接PepsiDialog
到 Redux 并can
直接从 Redux 使用(删除 local useState
)。或者,您可以将回调传递给PepsiDialog
将在关闭时调用的回调,并且父MainPage
级会将关闭状态传播到 Redux
推荐阅读
- python - Django Serializer 从 post 访问 json 数据(字符串索引必须是整数)
- django - 如何显示外键值而不是其 ID
- python-3.x - 将 Interactive Brokers API 导入 Pandas
- amazon-web-services - Avro 架构无效
- r - R中相同数据的相同操作无法预测的内存使用情况
- matlab-figure - 如何更改 MATLAB Surf 绘图颜色图?
- r - 每次运行此代码时,我都会收到未使用的参数错误,为什么?
- regex - 使用正则表达式替换文本 -Spoon
- java - org.mockito.exceptions.misusing.WrongTypeOfReturnValue:
- asp.net - 从 gridview 执行 ID 的命令时,SelectCommand.Connection 属性尚未初始化