【问题标题】:React Context Does Not Propagate Changes to Other Consumers After Successful Provider Update成功更新提供者后,React 上下文不会将更改传播给其他消费者
【发布时间】:2020-05-14 18:08:00
【问题描述】:

这是我的第一个 React Context 实现。我正在使用 Gatsby,在我的 layout.js 中添加了成功传递给消费者的上下文(带有对象和处理函数):

  import AppContext from "./AppContext"

  const Layout = ({ children }) => {

  let doAuthenticate = () => {
    authState = {
      isAuth: authState.isAuth === true ? false : true,
    }
  }

  let authState = { 
    isAuth: false,
    doAuthenticate: doAuthenticate
  }

  return (
    <>
      <AppContext.Provider value={authState}>
        <main>{children}</main>
      </AppContext.Provider>
    </>
  )

我在 Consumer 中成功执行了函数:

<AppContext.Consumer>
   { value =>
      <button onClick={value.doAuthenticate}Sign in</button>
    }
</AppContext.Consumer>

我还看到doAuthenticate 中的值已成功更新。

但是,正在侦听 Provider 的另一个 Consumer 不会更新该值。为什么?

【问题讨论】:

  • 你是说另一个组件没有获得价值,我说得对吗?
  • 是的,另一个组件没有获取到值
  • 你可以通过isAuth: authState.isAuth !== true简化你的isAuth: authState.isAuth === true ? false : true,
  • 注意简化 - 谢谢

标签: javascript reactjs gatsby react-context


【解决方案1】:

当您使用 Gatsby 时,我们将使用 Layout 组件包装页面的每个实例,因此您会看到,您最终会创建多个上下文,而不是创建一个在页面之间共享的上下文。

现在多个上下文无法相互通信

这里的解决方案是利用gatsby-ssr.jsgatsby-browser.js 中的wrapRootElement api 来用一个布局组件包装所有页面

import React from "react";
import Layout from "path/to/Layout";


const wrapRootElement = ({ element }) => {
  return (
    <Layout>
      {element}
    </Layout>
  )
}

export { wrapRootElement };

【讨论】:

  • 这听起来很有希望 - 谢谢!但是,在将上述代码添加到 gatsby-ssr.jsgatsby-browser.js 之后,我没有看到带有 Consumer 的组件得到更新。什么都没有解决。没有错误。我做错了吗?
  • 更新:我确实使用useState 管理这个工作,就像基于medium.com/@chathuranga94/…let [authState, setAuthState] = useState({...initialAuthState});。但是,一旦我导航到不同的页面,更新就会恢复为默认值。我通过 localStorage 解决了它以记住上一页的值。除非我遗漏了什么,否则上述解决方案似乎不会影响任何事情。
  • 你是否也改变了在每个单独页面中使用布局
  • index.js、about.js等每个页面在JSX中确实有&lt;Layout&gt;
  • @Vad 这正是问题所在,由于您已经将 Layout 呈现为 WrapRootElement,因此您不需要在 JSX 中显式使用 Layout
猜你喜欢
  • 1970-01-01
  • 2022-08-08
  • 1970-01-01
  • 2021-03-17
  • 2020-03-02
  • 2019-07-16
  • 2018-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多