如何更改功能组件中的上下文值?

How to change context value in functional component?

我有一个名为 StatusContext 的上下文,如下所示:

export const statusCtxInit = {
    open: false,
    toggleOpen() {
        this.open = !this.open;
    }
};

const StatusContext = React.createContext(statusCtxInit);
export default StatusContext

整个应用程序正在使用提供程序包装:

// ...
<StatusContext.Provider value={statusCtxInit}>
// ...

为了使用我的上下文的值,我在我的 FC 中使用了 useContext,当我得到值时它就起作用了。

function MyComp() {
    const status = useContext(StatusContext);
    return (
        <div>
            {status.open
                ? `It's Open`
                : `It's Closed`}

            <button onClick={() => status.toggleOpen()}>
                Toggle
            </button>
        </div>
    )
}

export default MyComp

另一方面,我也想通过调用 toggleOpen 来更改上下文,但是,它无法正常工作。实际上该值发生变化但不影响 MyComp.

我做错了什么?我该怎么办?

const statusContext = React.createContext()

const {Provider} = statusContext
//custom provider
export const StatusProvider = ({children}) => {
  const [isOpen, setOpen] = React.useState(false)
  const toggle = () => setOpen(v => !v)
  return (
    <Provider value={{isOpen, toggle}}>
      {children}
    </Provider>
  )
}

//custom hook
export const useStatus = () => useContext(StatusContext)

//usage
function MyComp() {
  const status = useStatus()
  return (
    <div>
      {status.isOpen
        ? `It's Open`
        : `It's Closed`}

      <button onClick={() => status.toggle()}>
        Toggle
      </button>
    </div>
  )
}

export default MyComp