Reactjs 如何使用react和typescript在同一组件文件中使用上下文?

Reactjs 如何使用react和typescript在同一组件文件中使用上下文?,reactjs,typescript,Reactjs,Typescript,我想从一个组件访问另一个组件的状态。为此,我只想将contextprovider包装到组件,在该组件中,单击按钮时状态会发生变化,并从usehook返回状态,以便另一个组件可以访问该状态 下面是在不应用上下文的情况下componnet的外观 function UploadButton () { //this is where state is set const [isDialogOpen, setIsDialogOpen] = React.useState(false);

我想从一个组件访问另一个组件的状态。为此,我只想将contextprovider包装到组件,在该组件中,单击按钮时状态会发生变化,并从usehook返回状态,以便另一个组件可以访问该状态

下面是在不应用上下文的情况下componnet的外观

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>
    );
}
上面的代码段不会呈现上载组件,因为无论我是否单击按钮,isDialogOpen始终为false


我不知道怎么了。有人能帮我吗?谢谢。

问题是,为了在UploadButton组件中使用useContext,您需要将react组件中的上下文提供程序提高一级。您不能将上下文提供程序放在UploadButton中以使用其上下文。您需要将提供程序移动到父组件中


这里有一个演示。

问题是,为了在UploadButton组件中使用useContext,您需要在react组件中将上下文提供程序提高一级。您不能将上下文提供程序放在UploadButton中以使用其上下文。您需要将提供程序移动到父组件中


这是一个演示。

谢谢,但它没有更新。一切似乎都很好,但这不起作用。@someuser2491更新了我的答案,我认为这是解决您问题的方法,但它没有更新。一切似乎都很好,但这不起作用。@someuser2491更新了我的答案,我认为这是你问题的解决方案