【问题标题】:How to initialize context only once at startup in React如何在 React 启动时只初始化一次上下文
【发布时间】:2021-11-13 19:15:37
【问题描述】:

我对 React 比较陌生。我有一组数据需要在启动时从服务器检索一次且仅一次。然后数据显示在我的Footer 组件中,该组件位于App.js 中。我认为useContext() 可能是最好的方法,但无法完全弄清楚。

初始化数据(一个对象)的代码是这样的:

 axios.get('/url/to/get/data')
            .then((response) => {
                const myData = response.data.mydata;
                setMyData({ key1: myData.field1, key2: myData.field2, key3: myData.field3 });

            });

现在,setMyData 是一个状态,它设置对象的值(由 Axios 调用返回的各种字段构成。

如何用这个值初始化上下文。

然后我有一个页脚组件,所以我想我想做这样的事情

<context.Provider>
   <Footer>
</context.Provider>

如果useContext 不可行,我愿意接受。本质上,寻找一个初始化一次的单例,然后页脚组件可以检索并为每个页面呈现。

【问题讨论】:

    标签: reactjs react-hooks singleton use-context


    【解决方案1】:

    您应该定义您的上下文,并在一次性useEffect 中对其进行初始化。加载后,所有孩子都可以使用useContext访问上下文

    这里的“技巧”是使用没有依赖关系的useEffect,导致它只运行一次(只要它的父级没有重新渲染)

    在这个例子中,我在直接子 (Main) 上使用上下文,但它可以在更深层次上使用。

    // initialize the context
    const MyContext = React.createContext();
    
    function App() {
      const [myData, setMyData] = React.useState(null);
    
      // Load your data once
      React.useEffect(() => {
        axios.get('/url/to/get/data')
                .then((response) => {
                    const myData = response.data.mydata;
                    setMyData({ key1: myData.field1, key2: myData.field2, key3: myData.field3 });
                });
      }, []);
    
      // Render the Provider and the app tree
      return (
        <MyContext.Provider value={myData}>
          <Main />
        </MyContext.Provider>
      );
    }
    
    // Consumer
    function Main() {
      const myData = useContext(MyContext);
      if (!myData) {
        return <div>Loading...</div>;
      }
    
      return (
        <div>{myData}</div>
      );
    }
    
    

    【讨论】:

    • 谢谢。我试过使用useEffect,但发现每次组件渲染时它都会重新执行(因为我在 App.js 中有这个,所以很多)。但是让我仔细看看你的解决方案,希望我会有更多的运气。我最初尝试将其作为我的页脚组件使用的单独组件。我在使用 React 时遇到的最大概念问题是,您必须在 App.js 中有这么多东西,因为所有数据都向下流动。所以如果 Comp AComp B 需要共享数据,你几乎必须在 App.js 中定义它
    • 请注意,我已将React.userEffect[] 定义为第二个参数,这保证了一次渲染。除非 App 组件被移除并重新添加到 DOM。
    • 使用context 来共享数据是一个好的开始,但是当做一个大型应用程序时,处理大型状态会变得有问题。状态管理有多种解决方案,从 Redux 到 MobX。阅读它们。
    猜你喜欢
    • 1970-01-01
    • 2023-03-24
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多