【问题标题】:React native useEffect cleanup functionReact 原生 useEffect 清理功能
【发布时间】:2021-07-05 06:44:17
【问题描述】:

我收到类似警告 Can't perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, cancel all subscriptions and asynchronous tasks in a useEffect cleanup function.

我正在使用此代码进行 useEffect 清理,但我仍然收到相同的警告。

useEffect(() => {
        let isMounted = true;
        
        if (isMounted) {
            displayData();
        }
        
        return () => { isMounted = false };
    }, []);

const displayData = async () => {
        try {
            let userToken = await AsyncStorage.getItem('userToken');
            setToken(userToken);
        }
        catch (error) {
            //console.log(error);
        }
}

有什么办法吗?

【问题讨论】:

  • 我想你最好显示displayData函数代码。它有 setState 调用吗?
  • 为什么需要一个ismounted boolean,调用displayData,只会调用一次。
  • @DeepinderSingh 我正在使用 ismounted boolea 进行 useEffect 清理。
  • @venomous31 你没有做任何清理,当 useEffect 没有 [] 使用时,这将很有用,你的 useffect 只在 init 上调用一次,所以你在这里并不需要这个。如果 is 没有 '[]' 那么这将很有用。
  • @DeepinderSingh 不工作。

标签: reactjs react-native react-hooks


【解决方案1】:

你的警告是Can't perform a React state update on an unmounted component.

因为AsyncStorage.getItem 是异步的,所以有可能在它解析为一个值时组件已经被卸载。

如果您尝试使用 AsyncStorage.getItem 解析的值设置组件的状态(并且在组件已被卸载后发生),您会收到此警告。

AsyncStorage.getItem貌似没有取消机制,所以要注意异步AsyncStorage.getItem解析值后的后续状态设置。

import React, { useState, useEffect } from 'react';
import AsyncStorage from '@react-native-async-storage/async-storage';

export default function App() {
  const [token, setToken] = useState('');

  useEffect(() => {
    let isMounted = true;

    const displayData = async () => {
      try {
        let userToken = await AsyncStorage.getItem('userToken');
        if (isMounted) {
          setToken(userToken);
        }
      } catch (error) {
      //console.log(error);
      }
    };


    displayData();

    return () => {
      isMounted = false;
    };
  }, []);

  return (
    <>...</>
  );
}

Snack

【讨论】:

  • 我想在 useEffect 之外致电 displayData
  • 看到您的代码我仍然感到困惑。我也在刷新时打电话给displayData。这就是我在 useEffect 之外创建它的原因。
  • 刷新是什么意思?
  • Scrollview 内的RefreshControl
猜你喜欢
  • 2022-01-23
  • 2021-02-07
  • 1970-01-01
  • 2021-12-24
  • 2021-04-09
  • 2021-10-31
  • 2020-02-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多