【问题标题】:How to use Context API to pass down a state while using a Router in React JS在 React JS 中使用路由器时如何使用 Context API 传递状态
【发布时间】:2020-07-23 01:06:32
【问题描述】:

我有一个上下文 API 文件设置,它有一个状态和一个从 API 获取数据并设置状态的函数,我想将状态传递给我的其他组件。在我的 App.js 中,我使用 React-Router 来指定路由。如何在使用 React-Router 的同时使用 Context API 将状态传递给这些组件。

我的 ApiContext.js 文件如下所示:

import React, {useState, createContext } from 'react';

export const ApiContext = createContext();

export const ApiProvider = async (props) => {
    const [data, setData] = useState(null);

    const getURL = 'https://examplefetchsite.com';
    const response = await fetch(getURL).json();
    setData(response);
    return (
        <ApiContext.Provider value={[data, setData]}>
            {props.children}
        </ApiContext.Provider>
    );
}

我的 App.js 的返回是这样的:

return (
      <ApiProvider>
        <Router>
          <div>
            <NavBar />
            <Switch>
            <Route path="/" exact component={ Dashboard } />
            <Route path="/create" component={ Create } />
            <Route path="/view" component={View} />
            </Switch>
          </div>
        </Router>
      </ApiProvider>
    )

【问题讨论】:

    标签: javascript html reactjs frontend context-api


    【解决方案1】:

    ApiProvider

    <ApiContext.Provider value={{data, setData}}>
    

    子组件

    const context = useContext(ApiContext); 
    console.log(context.data); 
    context.setData(123);
    

    【讨论】:

      【解决方案2】:

      就上下文本身而言,您无需更改提供程序中的任何内容,只需在子组件中执行类似操作:

      import React, {useContext} from 'react'
      import {ApiContext} from './ApiContext'
      
      const Dashboard = (props) => {
          const [data, setData] = useContext(ApiContext)
      
          //you should have access to both data and setData
      
          return (
              //things
          )
      }
      

      但是在ApiContext.js 中,您没有正确调用 API 请求。您应该使用useEffect 仅在第一次渲染时获取数据。

      import React, {useState, createContext, useEffect} from 'react';
      
      export const ApiContext = createContext();
      
      export const ApiProvider = (props) => {
          const [data, setData] = useState(null);
      
          useEffect(async () => {
              const getURL = 'https://examplefetchsite.com';
              const response = await fetch(getURL).json();
              setData(response);
          }, [])
      
          return (
              <ApiContext.Provider value={[data, setData]}>
                  {props.children}
              </ApiContext.Provider>
          );
      }
      

      【讨论】:

      • 我目前正在这样做,但 React 会抛出此错误“对象作为 React 子级无效(找到:[object Promise])。如果您打算渲染一组子级,请使用数组而是。”
      • 不,我尝试了 useEffect() ,但这似乎并没有解决它。我仍然收到我上面提到的错误。
      • 你试过我的代码了吗?你在ApiProvider 中有一个async,它会尝试创建一个异步组件,这是不可能的
      • 非常感谢你!我意识到问题出在异步上,一旦我删除了异步它就起作用了,愚蠢的我!谢谢!
      • 如果上下文发生变化,这会导致重新渲染吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-28
      • 2020-07-15
      • 2019-09-03
      • 1970-01-01
      • 2018-11-19
      • 2017-05-03
      相关资源
      最近更新 更多