从 REST API 填充上下文并在带有 useEffect 和 useContext 的 React 组件中使用它

Posted

技术标签:

【中文标题】从 REST API 填充上下文并在带有 useEffect 和 useContext 的 React 组件中使用它【英文标题】:Fill context from REST API and use it in a React component with useEffect and useContext 【发布时间】:2020-06-12 13:02:31 【问题描述】:

先决条件

我在一个带有一些输入的组件中有一个表单,这些输入需要一些配置数据。配置数据来自 REST API。

目标

调用 REST API 并将配置数据存储在 React 上下文中,以便重复使用。

做了什么

1/ 我创建了组件及其输入。 2/ 我使用模拟配置数据来渲染组件。 3/ 我创建了上下文,所以我用 React 上下文提供的一组新配置数据替换了模拟配置数据(总是模拟)。 4/ 我用来自 REST API 的配置数据填充了上下文。

问题

我在组件中使用上下文 API,但从上下文返回的配置数据为空。

interface ContextType 
  formConfig: any[];


export const Context = React.createContext<ContextType>(
 formConfig: [],
 getFormConfig: () => [],
);


export const ContextProvider: React.FC<
  children: React.ReactNode;
> = ( children ) => 

  let formConfig: any[] = [];

  function getFormConfig() 
    return formConfig;
  

  useEffect(() => 
    (async function fetchData() 
      formConfig = await ServiceConfig.getFormTypes();
      console.log(formConfig, 'use effect of context'); // It shows the conf
    )();
  , []);


  return (
    <Context.Provider
      value=
        getFormConfig,
        formConfig
      
    >
      children
    </Context.Provider>
  );
;

const FormUI: React.FC = () => 


    const  getFormConfig  = useContext(Context);

    useEffect(() => 
        console.log(getFormConfig(), 'form'); // it is empty here
    , []);

    return (
        <ContextProvider>
            ....
        </ContextProvider>
    )
;

【问题讨论】:

【参考方案1】:

let formConfig: any[] = [];只是一个变量,当你重新渲染它时,它会被重新创建并分配[]给它。

你需要将它存储在一个状态中。

const [formConfig, setFormConfig] = React.useState([])

在异步函数中,你设置状态

  useEffect(() => 
    (async function fetchData() 
      formConfig = await ServiceConfig.getFormTypes();
      setFormConfig(formConfig) // setting the state
      console.log(formConfig, 'use effect of context'); // It shows the conf
    )();
  , []);

很抱歉无法在打字稿中给你答案

【讨论】:

以上是关于从 REST API 填充上下文并在带有 useEffect 和 useContext 的 React 组件中使用它的主要内容,如果未能解决你的问题,请参考以下文章

如何使用flutter Dropdown小部件从Django REST API端点填充数据

REST API:无法填充 Tableview

带有 okta OAUTH 令牌身份验证的 Django Rest API

Apollo Server:如何从 REST API 数据源访问 Dataloader 中解析器之外的“上下文”

Rest API 调用返回带有 LocalDate 的错误

如何从远程机器访问 REST API?