代码之家  ›  专栏  ›  技术社区  ›  Rohit

无法通过获取上下文获取数据

  •  1
  • Rohit  · 技术社区  · 3 年前

    我有一个简单网站的上下文,我想通过页面加载获取来加载它。我创建了上下文和提供程序:

    const ResumeContext = createContext<ResumeJson | undefined>(undefined);
    
    export function useResumeContext() {
        const context = useContext(ResumeContext);
        return context;
    }
    
    function ResumeLoader({ children }: PropsWithChildren) {
        let resume = useResumeContext();
    
        useEffect(() => {
            async function getResumeJson() {
                const response = await fetch("resume.json");
                const data: ResumeJson = await response.json();
                return data;
            }
    
            getResumeJson().then((data) => {
                resume = data;
                console.log(data);
            });
        }, []);
    
        return <Fragment></Fragment>;
    }
    
    export default function ResumeContextProvider({ children }: PropsWithChildren) {
        return (
            <ResumeContext.Provider value={undefined}>
                <ResumeLoader />
                {children}
            </ResumeContext.Provider>
        );
    }
    

    然后将其设置在我的应用程序的底部 index.tsx :

    root.render(
        <React.StrictMode>
            <ResumeContextProvider>
                <App />
            </ResumeContextProvider>
        </React.StrictMode>
    );
    

    我看到fetch加载的数据,但在应用程序组件中,当我使用 useResumeContext ,值永远不会改变。

    1 回复  |  直到 3 年前
        1
  •  1
  •   NoName    3 年前

    您没有使用提取的数据更新上下文值。您应该将简历数据保持在 ResumeContextProvider 并在获取完成时更新该状态。以下是更正后的版本:

    import React, { createContext, useContext, useEffect, useState, PropsWithChildren, Fragment } from 'react';
    
    const ResumeContext = createContext<ResumeJson | undefined>(undefined);
    
    export function useResumeContext() {
        const context = useContext(ResumeContext);
        return context;
    }
    
    function ResumeLoader({ setResume }: { setResume: (resume: ResumeJson) => void }) {
        useEffect(() => {
            async function getResumeJson() {
                const response = await fetch("resume.json");
                const data: ResumeJson = await response.json();
                return data;
            }
    
            getResumeJson().then((data) => {
                setResume(data);
                console.log(data);
            });
        }, [setResume]);
    
        return <Fragment></Fragment>;
    }
    
    export default function ResumeContextProvider({ children }: PropsWithChildren) {
        const [resume, setResume] = useState<ResumeJson | undefined>(undefined);
    
        return (
            <ResumeContext.Provider value={resume}>
                <ResumeLoader setResume={setResume} />
                {children}
            </ResumeContext.Provider>
        );
    }
    

    注意,我添加了 setResume 道具到 ResumeLoader 并将简历包装在 简历上下文提供程序 。现在,什么时候 getResumeJson 获取数据,它将更新状态,并使用 useResumeContext 将使用新数据重新渲染。