reactjs - Expo React 警告 : Can't perform a React state update on an unmounted component. 这是一个空操作,但它表明您的应用程序中存在内存泄漏

标签 reactjs firebase react-native expo use-effect

我是 native react 的新手,并且正在关注有关如何与 firebase auth 连接的媒体教程。一切似乎都正常,但我不断收到以下警告:
警告:无法对卸载的组件执行 React 状态更新。这是一个空操作,但它表明您的应用程序中存在内存泄漏。要修复,请取消 useEffect 清理函数中的所有订阅和异步任务。
我几乎完全按照教程中所说的去做,并尝试了其他一些方法来修复它,但似乎没有任何效果。这是它指向错误的代码:

    let currentUserUID = firebase.auth().currentUser.uid;

    const [firstName, setFirstName] = useState('');

    useEffect(() => { 
        getUserInfo();
      })

      async function getUserInfo(){
        try {
          let doc = await firebase
            .firestore()
            .collection('users')
            .doc(currentUserUID)
            .get();
  
          if (!doc.exists){
            Alert.alert('No user data found!')
          } else {
            let dataObj = doc.data();
            setFirstName(dataObj.firstName)
          }
        } catch (err){
        Alert.alert('There is an error.', err.message)
        }
      }

如果有人能帮我解决这个问题并解释到底出了什么问题,那就太好了。
这是link到我正在关注的教程:

最佳答案

这里的问题是您可能在卸载组件后将状态更新排入队列。由于您是直接异步访问 Firestore,因此您可以使用 React ref 来跟踪在将更新加入队列之前组件是否仍处于挂载状态。

const isMountedRef = React.ref(null);

useEffect(() => {
  isMountedRef.current = true;               // set true when mounted
  return () => isMountedRef.current = false; // clear when unmounted
}, []);

useEffect(() => {
  async function getUserInfo(){
    try {
      let doc = await firebase
        .firestore()
        .collection('users')
        .doc(currentUserUID)
        .get();

      if (!doc.exists){
        Alert.alert('No user data found!')
      } else {
        let dataObj = doc.data();
        if (isMountedRef.current) { // <-- check if still mounted
          setFirstName(dataObj.firstName);
        }
      }
    } catch (err){
      Alert.alert('There is an error.', err.message)
    }
  }
  getUserInfo();
}, []); // <-- include dependency array, empty to run once when mounting

关于reactjs - Expo React 警告 : Can't perform a React state update on an unmounted component. 这是一个空操作,但它表明您的应用程序中存在内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69263875/

相关文章:

node.js - 将社交登录(使用 Google 登录)添加到现有电子邮件/密码应用程序和数据库的最佳方法是什么?

javascript - react Redux + redux 坚持 : only part of the data persists

javascript - 如何使用表单输入数据作为React Native中axios请求的输入?

Javascript对象数组然后删除元素

javascript - Array.map() 如何与 React 组件一起使用?

javascript - React-rangeslider 不显示在引导模式上

javascript - 我什么时候需要使用 super(props) 将 prop 传递给 React 组件的构造函数?

java - android studio firebase gettoken id

ios - 如何使用 firebase 修复 flutter iOS 崩溃?

ios - 为什么我从数据库中提取信息的函数不起作用?