我无法从子组件更新上下文对象。这是我用于创建react上下文的提供商文件,该组件被封装在整个应用程序的根app.tsx文件中。
我可以在子组件中获取上下文但我不知道如何更新它。
const CorporateContext = React.createContext(undefined);
export const useCorporateContext = () => {
return useContext(CorporateContext);
};
export const CorporateProvider = ({ children }) => {
const [corporateUserData, setCorporateUserData] = useState(undefined);
useEffect(() => {
const localStorageSet = !!localStorage.getItem('corporateDetailsSet');
if (localStorageSet) {
setCorporateUserData({corporateId: localStorage.getItem('corporateId'), corporateRole: localStorage.getItem('corporateRole'), corporateAdmin: localStorage.getItem('corporateAdmin'), corporateSuperAdmin: localStorage.getItem('corporateSuperAdmin')});
} else {
(async () => {
try {
const json = await
fetchCorporateUserDetails(getClientSideJwtTokenCookie());
if (json.success !== true) {
console.log('json invalid');
return;
}
setCorporateUserData({corporateId: json.data.corporate_id, corporateRole: json.data.corporate_role, corporateAdmin: json.data.corporate_role == 'Admin', corporateSuperAdmin: json.data.corporate_super_admin});
addCorporateDetailsToLocalStorage(corporateUserData);
} catch (e) {
console.log(e.message);
}
})();
}
}, []);
return (
<CorporateContext.Provider value={corporateUserData}>
{children}
</CorporateContext.Provider>
);
};
export default CorporateProvider;
更新:以下是我改变的内容,上下文似乎更新了(至少当我检查chrome devtools时它看起来更新了),但子组件没有重新渲染,一切仍然保持不变:
我把react context改成:
const CorporateContext = React.createContext({
corporateContext: undefined,
setCorporateContext: (corporateContext) => {}
});
更改组件中的useState钩子:
const [corporateContext, setCorporateContext] = useState(undefined);
将setState作为属性传递给context:
<CorporateContext.Provider value={{corporateContext , setCorporateContext}}>
{children}
</CorporateContext.Provider>
您还可以将setCorporateUserData
作为第二个值传递给提供商组件,如下所示:
//...
return (
<CorporateContext.Provider value={{corporateUserData, setCorporateUserData}}>
{children}
</CorporateContext.Provider>
);
您可以在任何时候使用useContext
钩子将其解构。
如何解决这个问题:
问题是我已经克隆了corporateContext对象并更改了该克隆对象的属性,然后我将其传递给setCorporateContext()方法。结果,上下文被更新了,但是react没有注意到变化,子组件也没有更新。
let newCorporateContext = corporateContext;
newCorporateContext.property = newValue;
setCorporateContext(newCorporateContext);
之后,我使用javascript扩展操作符来改变setCorporateContext()方法中的corporateContext属性。
setCorporateContext({...corporateContext, property: newValue);
之后,react注意到钩子和子组件的变化被重新渲染!