【问题标题】:How to fix: Warning: Can't perform a React state update on an unmounted component如何修复:警告:无法对未安装的组件执行 React 状态更新
【发布时间】:2020-07-08 20:15:34
【问题描述】:

我在useEffect之外有一个叫getRelevates的函数,问题是当我改变我的组件的状态以添加获得的信息时,控制台返回这个错误:

警告:无法对未安装的组件执行 React 状态更新。这是一个空操作,但它表明您的应用程序中存在内存泄漏。要解决此问题,请在 useEffect 清理函数中取消所有订阅和异步任务。

这是我的组件的代码:

import React, { useEffect, useState } from 'react';

import './Start.css';

import CardProduct from '../CardProduct/CardProduct';
import { db } from '../../firebase';
import CardEstreno from '../CardEstreno/CardEstreno';

const Start = () => {
    const [productsRelevates, setProductsRelevates] = useState([]);
    const [productsEstreno, setProductsEstreno] = useState([]);

    const getRelevates = () => {
            db.collection('Products').onSnapshot((querySnapshot) => {
                const docs = [];
                const es = [];
                querySnapshot.forEach((doc) => {
                    if (doc.data().Relevancia === true) {
                        docs.push({ ...doc.data(), id: doc.id });
                    }

                    if (doc.data().Estreno === true) {
                        es.push({ ...doc.data(), id: doc.id });
                    }
                });
                setProductsRelevates(docs);
                setProductsEstreno(es);
            });
        };

    useEffect(() => {
        getRelevates();
    }, []);
    
    return <div className="recom">
                    {productsRelevates !== []
                        ? productsRelevates.map((doc) => {
                                return (
                                    <div key={doc.id}>
                                        <CardProduct product={doc} />
                                    </div>
                                );
                          })
                        : ''}
                </div>
}

【问题讨论】:

    标签: javascript reactjs


    【解决方案1】:

    您必须使用返回函数清理 useEffect 中的侦听器。像这样的东西(未经测试):

    import React, { useEffect, useState } from 'react';
    
    import './Start.css';
    
    import CardProduct from '../CardProduct/CardProduct';
    import { db } from '../../firebase';
    import CardEstreno from '../CardEstreno/CardEstreno';
    
    const Start = () => {
        const [productsRelevates, setProductsRelevates] = useState([]);
        const [productsEstreno, setProductsEstreno] = useState([]);
         
          useEffect(() => {
    
            const onSnapshotHandler =  querySnapshot => {
              const docs = [];
              const es = [];
              querySnapshot.forEach((doc) => {
                  if (doc.data().Relevancia === true) {
                      docs.push({ ...doc.data(), id: doc.id });
                  }
        
                  if (doc.data().Estreno === true) {
                      es.push({ ...doc.data(), id: doc.id });
                  }
              });
              setProductsRelevates(docs);
              setProductsEstreno(es);
            };
    
            const unsubscribe = db.collection('Products').onSnapshot(onSnapshotHandler);
    
            return (() => unsubscribe());
            
        }, []);
        
        return <div className="recom">
                        {productsRelevates !== []
                            ? productsRelevates.map((doc) => {
                                    return (
                                        <div key={doc.id}>
                                            <CardProduct product={doc} />
                                        </div>
                                    );
                              })
                            : ''}
                    </div>
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-24
      • 2021-03-27
      • 2019-09-11
      • 2021-08-07
      • 2020-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多