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

标签 reactjs firebase react-hooks react-context use-effect

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

console log output

这是我的代码:

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>
    );
}

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

最佳答案

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

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

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

关于reactjs - 如何使用 React Hooks 和 Context API 将来自 useEffect 内部调用的多个端点的数据正确添加到状态对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59293647/

相关文章:

javascript - React 组件在重新渲染时忽略动态元素

reactjs - React 测试库 : Test attribute/prop

javascript - Angular/Firebase : How to put user response in front-end model

firebase - 执行 npx firestore-algolia-search 时出现 Npx 问题

javascript - 在 useState 钩子(Hook)回调中使用副作用可以吗?

javascript - 为什么 useEffect 没有被触发?

arrays - react JS : Filter an array by a string

javascript - Firebase:推送到实时数据库后立即删除数据

javascript - 在子组件中传递和调用的函数无权访问父状态值

reactjs - 如何确保在功能组件中使用 React hooks 一行代码只执行一次?