提问者:小点点

如何删除警告,而加载主屏幕上的反应状态更新


加载主屏幕时,控制台会记录恼人的警告。如何删除此警告,我已创建一个常量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();
  }, []);

共1个答案

匿名用户

如果isMountedref,您可以使用第二种效果来更新该值。然后,在调用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();
}, []);