如何使用 React Hooks 和 Context API 正确地将来自 useEffect 内部调用的多个端点的数据添加到状态对象?

Posted

技术标签:

【中文标题】如何使用 React Hooks 和 Context API 正确地将来自 useEffect 内部调用的多个端点的数据添加到状态对象?【英文标题】:How do I correctly add data from multiple endpoints called inside useEffect to the state object using React Hooks and Context API? 【发布时间】:2020-04-05 04:46:48 【问题描述】:

我在 fetchData 函数中调用 firestore,然后将接收到的数据添加到状态对象,但问题是全局状态被最后一个 api 调用覆盖,如我的 console.log 输出所示:

这是我的代码:

import React,  useState, useEffect  from 'react';

import  db  from './firebase';

export const StateContext = React.createContext();

export function ContextController( children ) 
    const intialState = 
        projectList: [],
        blogList: [],
        count: 0
    ;

    const [state, setState] = useState(intialState);

    useEffect(() => 
        fetchData();
    , []);

    async function fetchData() 
        // get all projects
        db.collection('projects')
            .get()
            .then((querySnapshot) => 
                const data = querySnapshot.docs.map((doc) => doc.data());
                let sorted = [];

                // loop through each object and push to sorted array
                data.forEach((item) => 
                    sorted.push(item.body);
                );
                // reverse sort the projects
                sorted.sort(
                    (a, b) => parseInt(b.project_id) - parseFloat(a.project_id)
                );
                setState(
                    ...state,
                    projectList: sorted
                );
            );

        // get all blogs
        db.collection('blog')
            .get()
            .then((querySnapshot) => 
                const data = querySnapshot.docs.map((doc) => doc.data());
                setState(
                    ...state,
                    blogList: data
                );
            );
    

    return (
        <StateContext.Provider value=[state, setState]>
            children
        </StateContext.Provider>
    );


如何正确地将来自两个端点的数据添加到状态对象,以便我可以在应用程序的任何位置访问它?

【问题讨论】:

【参考方案1】:

我认为问题在于您将旧状态传播到 setState 的位置已经过时。 React 围绕 setState 做了一些性能增强,这将使这样的代码无法按预期工作。

要尝试的一件事是使用 setState 回调。

setState((state) => (
                ...state,
                projectList: sorted
            ));

【讨论】:

哇,好用,回调绝对是问题所在。谢谢!

以上是关于如何使用 React Hooks 和 Context API 正确地将来自 useEffect 内部调用的多个端点的数据添加到状态对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 react-apollo-hooks 和 formik 中使用突变?

如何在 React with Typescript 中使用和指定通用 Hooks?

如何使用 React hooks 和 Redux 从 useEffect 执行 store.unsubscribe

翻译在 React Hooks 中如何请求数据?

如何使用 React Hooks 和 OpenWeatherMap API 获取 5 天天气预报

使用 React-Hooks 单击按钮后如何显示不同的组件?