Reactjs 提供者组件';在安装之前,useEffect正在运行

Reactjs 提供者组件';在安装之前,useEffect正在运行,reactjs,react-hooks,use-effect,react-context,Reactjs,React Hooks,Use Effect,React Context,我有一个提供者组件,它通过它的道具传递一些数据,这些道具稍后将在整个应用程序中使用 它看起来像这样: export const MyContext=createContext({}); MyContext.displayName='我的上下文'; 导出常量MyProvider=({children})=>{ const[items,setItems]=useState([]); const[loading,setLoading]=useState(false); const setData=as

我有一个提供者组件,它通过它的道具传递一些数据,这些道具稍后将在整个应用程序中使用

它看起来像这样:

export const MyContext=createContext({});
MyContext.displayName='我的上下文';
导出常量MyProvider=({children})=>{
const[items,setItems]=useState([]);
const[loading,setLoading]=useState(false);
const setData=async()=>{
设置加载(真);
setItems(等待getItemsApiCall());
设置加载(假);
};
useffect(()=>{
console.warn('组件重新呈现')
如果(!items.length){
setData();
}
},[项目];
返回(
{儿童}
);
};
理论上,这应该可以正常工作,但是我通过
控制台看到了大量额外的重新渲染。warn
似乎不必要,而且我还收到了与未安装组件的状态更新相关的警告

警告:无法对已卸载的组件执行React状态更新。这是一个no op,但它表明应用程序中存在内存泄漏

虽然我已经看到了,但它们都不适用于我,因为我不仅要设置
,而且还要加载
,在获取数据时,我需要在应用程序的其他部分放入微调器和其他类似的东西

无论如何,在这种情况下,有没有办法防止这些重新呈现在挂载之前,并超越警告

编辑:对于记录,我目前在更新未安装组件的状态的警告之前得到了2次重新渲染,然后是另外两次重新渲染(预期的)。所以基本上,我的控制台是这样的:

组件重渲染

组件重渲染

警告:无法对已卸载的组件执行React状态更新。这是一个no op,但它表明应用程序中存在内存泄漏

组件重渲染

组件重渲染

Edit2:我还想展示一下
MyProvider
是如何使用的。它只是将另一个组件包装到特定的路径中。大概是这样的:

const-App=()=>(
(
)}
/>
)

我在上面看到的行为只发生在访问
/items
路由时。

Typo
value={items,loading}
->
value={{{items,loading}}
我非常怀疑它在呈现之前是否运行。控制台日志运行了多少次?从你的代码来看,它应该被调用两次。一次加载和一次之后
设置项called@NemanjaLazarevic那确实是个打字错误,谢谢。但请记住,这只是本文中的一个例子,所以它不会影响我的实际工作code@aziumconsole.warn在获得装载前更新状态的警告之前运行了两次。然后在警告之后两次。我正试图摆脱这个警告,它在警告之前运行了两次。看起来很可能。您可以通过添加
useffect(()=>console.log('mounted'),[])进行测试并计算您看到的数量。键入
value={items,loading}
->
value={{{items,loading}
?我非常怀疑它在呈现之前是否运行。控制台日志运行了多少次?从你的代码来看,它应该被调用两次。一次加载和一次之后
设置项called@NemanjaLazarevic那确实是个打字错误,谢谢。但请记住,这只是本文中的一个例子,所以它不会影响我的实际工作code@aziumconsole.warn在获得装载前更新状态的警告之前运行了两次。然后在警告之后两次。我正试图摆脱这个警告,它在警告之前运行了两次。看起来很可能。您可以通过添加
useffect(()=>console.log('mounted'),[])进行测试并计算您看到的数量。