javascript - 如何解决“无法对未安装的组件执行反应状态更新”
问题描述
无法对未安装的组件执行 React 状态更新。这是一个空操作,但它表明您的应用程序中存在内存泄漏。要解决此问题,请在 useEffect 清理函数中取消所有订阅和异步任务。在 PokemonListItem(在 PokemonList.jsx:148)
好的,我知道这是一个常见问题,解决方案应该很简单。我只是不知道如何在我的代码中实现它。
我正在使用 React-Native 和 PokéAPI 制作一种用于移动设备的 Pokédex。我不确定泄漏在哪里,所以请有经验的开发人员提供帮助。
口袋妖怪列表项
export default function PokemonListItem({ url, Favorite }) {
const [pokemondata, setData] = React.useState({});
const [dataReady, setReady] = React.useState(false);
const [isFavorite, setFavorite] = React.useState(false);
const favoriteStatus = (bool) => {
setFavorite(bool);
};
const getData = async () => {
await fetch(url)
.then((res) => res.json())
.then((data) => setData(data));
setReady(true);
};
React.useEffect(() => {
getData();
}, []);
more code...
口袋妖怪列表
const renderItem = ({ item }) => (
<TouchableHighlight
style={{ borderRadius: 10 }}
underlayColor="#ffc3c2"
onPress={() => {
navigation.navigate("Pokémon Details", {
url: item.url,
});
}}
>
<PokemonListItem url={item.url} Favorite={FavoriteButton} />
</TouchableHighlight>
);
如果您需要查看完整代码,可以访问存储库。
解决方案
一种方法似乎是维护一个变量来查看组件是否仍然安装,这对我来说感觉很臭(React-hooks。无法对未安装的组件执行React状态更新) - 但无论如何这是我将如何在您的代码中看到它...
let isMounted;
const getData = async () => {
await fetch(url)
.then((res) => res.json())
.then((data) => { if(isMounted) setData(data)});
setReady(true);
};
React.useEffect(() => {
isMounted = true;
getData();
return () => {
isMounted = false;
}
}, []);
推荐阅读
- python - 如果 a 和 b 超出索引范围,为什么 python 允许 list[a:b] 但不允许 list[a]?
- c++ - 蛇游戏中drawGame函数的问题
- scala - 使用 DataFrame.registerTempTable 时是否有任何内存或表大小限制?
- python - 此输出中的 conda 依赖冲突在哪里?我看不见他们。:(
- javascript - Angular 7+中div的滚动位置
- python-3.x - Python,如何修复 if 和 else 语句
- javascript - 如何通过 react.js 访问所有这些字符 json
- amazon-web-services - 如何将 food-101 数据集转换为 AWS SageMaker 可用的格式
- reactjs - nonPersistent 选项,将应用程序从 React Native 0.55 升级到 0.60.2
- angular - 尝试在角度中使用两种方式绑定,ngmodel 从数据库中获取数据,但在保存到数据库时抛出空值