加载主屏幕时,控制台会记录恼人的警告。如何删除此警告,我已创建一个常量isMounted=useRef(null)代码>它是如何工作的,我应该在哪里使用它?
isMounted.current = true;
return () => {
// executed when unmount
isMounted.current = false;
}
警告:无法对已卸载的组件执行React状态更新。这是一个no-op,但它表示应用程序中存在内存泄漏。要修复此问题,请取消useEffect清理函数中的所有订阅和异步任务。在家(由Context.Consumer创建)在路由器(由BrowserRouter创建)的交换机(在App.js:20)中的路由(在App.js:21处)在应用程序的BrowserRouter(在App.js:17处)中
主页。js
const isMounted = useRef(null);
useEffect(() => {
const fetchData = async () => {
try {
const res = await Axios.get('http://localhost:8000/service/players');
setPlayerList(res.data.players);
setSearchResults(res.data.players);
showDeleteIcon(privilege);
} catch (e) {
console.log(e);
}
}
fetchData();
}, []);
如果isMounted
ref,您可以使用第二种效果来更新该值。然后,在调用setState
之前,您可以检查isMounted。当前
以查看您是否仍在装载。
const isMounted = useRef(false);
useEffect(() => {
isMounted.current = true;
return () => isMounted.current = false;
}, []);
useEffect(() => {
const fetchData = async () => {
try {
const res = await Axios.get('http://localhost:8000/service/players');
if (isMounted.current) {
setPlayerList(res.data.players);
setSearchResults(res.data.players);
showDeleteIcon(privilege);
}
} catch (e) {
console.log(e);
}
}
fetchData();
}, []);
。当前
属性正是React REF工作的方式。我真的不知道他们为什么那样做,但本质上这就是你获取/设置值的方式。它与状态不同,因为状态更改会导致重新渲染,而ref更新不会。
一个不需要ref和新效果的更好的方法可能是使用状态设置器的回调版本,因为如果组件被卸载,React可能会避免调用您的回调:
useEffect(() => {
const fetchData = async () => {
try {
const res = await Axios.get('http://localhost:8000/service/players');
setPlayerList(() => res.data.players);
setSearchResults(() => res.data.players);
showDeleteIcon(() => privilege);
} catch (e) {
console.log(e);
}
}
fetchData();
}, []);