reactjs - 如何使用 react 和 typescript 在同一组件文件中使用上下文?
问题描述
我想访问从一个组件到另一个组件的状态。为此,我只想将 contextprovider 包装到单击按钮时状态发生变化的组件,并从 usehook 返回状态,以便另一个组件可以访问该状态。
下面是组件在没有应用上下文的情况下的外观,
function UploadButton () { //this is where state is set
const [isDialogOpen, setIsDialogOpen] = React.useState(false);
const handleClick = () => {
setIsDialogOpen(!isDialogOpen);
}
return (
<>
<Button onClick={handleClick}/>
{isDialogOpen && <Upload/>}
</>
);
}
function UserButton() { //this is where state is accessed
return (
<Icon/> //this icon should be displayed only if !isDialogOpen
);
}
上下文如下所示,我在 UploadButton 所在的同一文件中有 DialogContext。
interface DialogCtxState {
isDialogOpen: boolean;
setIsDialogOpen: React.Dispatch<React.SetStateAction<boolean>>;
}
const initialDialogState: DialogCtxState = {
isDialogOpen: false,
setIsDialogOpen: () => {},
};
const DialogContext = React.createContext<DialogCtxState>(
initialDialogState
);
export const DialogContextProvider: React.FC = ({ children }) => {
const [isDialogOpen, setIsDialogOpen] = React.useState<boolean>(false);
return (
<DialogContext.Provider
value={{
isDialogOpen,
setIsDialogOpen,
}}
>
{children}
</DialogContext.Provider>
);
}
function UploadButton () {
const {isDialogOpen, setIsDialogOpen} = React.useContext(DialogContext);
const handleClick = () => {
setIsDialogOpen(!isDialogOpen);
console.log('isDialogOpen', isDialogOpen) //prints false here.
}
return (
<DialogContextProvider>
<>
<Button onClick={handleClick}/>
{isDialogOpen && <Upload/>} //this doesnt render on clicking button as isDialogOpen
//is false
</>
</DialogContextProvider>
);
}
上面的代码片段不会呈现 Upload 组件,因为无论我是否单击按钮,isDialogOpen 始终为 false。
我不知道出了什么问题。有人可以帮我吗?谢谢。
解决方案
问题是您需要将您的上下文提供程序在您的反应组件中提高一级才能useContext
在您的UploadButton
组件中使用。您不能将上下文提供程序放在其中UploadButton
以使用它的上下文。您需要将提供程序移动到父组件中。
这是一个演示它的代码框。
推荐阅读
- kubernetes - 什么是每次部署运行一次的 initContainer/job 的正确替代品?
- python - 向空的 Pandas 数据框添加一行
- javascript - JavaScript:使用 toFixed() 方法的问题
- azure-devops - 如何离线安装 VSTS 同步迁移工具?
- python - 每次用户答对问题时,如何提高分数?
- flutter - 检测 TextField 外部的点击以取消焦点
- scala - Scala Play:使用可选字段实现自定义 QueryStringBindable
- excel - 基于公式结果的条件格式
- excel - Excel条件格式色标公式
- python - 如何监视文件夹并在打开时执行操作?(例如:Python 看门狗)