Eu tenho um contexto para um site simples que desejo carregar por meio de busca no carregamento da página. Eu criei o contexto e o provedor:
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>
);
}
E então configure-o na base do meu aplicativo, no index.tsx
:
root.render(
<React.StrictMode>
<ResumeContextProvider>
<App />
</ResumeContextProvider>
</React.StrictMode>
);
Vejo os dados carregados pelo fetch, mas no componente App, quando uso o useResumeContext
, o valor nunca muda.
Você não está atualizando o valor de contexto com os dados buscados. Você deve manter os dados de resumo em um estado dentro
ResumeContextProvider
e atualizar esse estado quando a busca for concluída. Aqui está uma versão corrigida:Observe que adicionei um
setResume
suporteResumeLoader
e envolvi o currículo em um estado dentro deResumeContextProvider
. Agora, quandogetResumeJson
buscar os dados, ele atualizará o estado e todos os componentes usadosuseResumeContext
serão renderizados novamente com os novos dados.