【问题标题】:UseEffect Infinite Loop , with axiosUseEffect 无限循环,带 axios
【发布时间】:2021-05-29 09:53:59
【问题描述】:

您好,我在带有 axios 的 reactt 中使用 Useeffect 来显示数据库中的对象, 我在使用效果中遇到了一个无限循环,我很多时候无法在浏览器上显示对象, 但是spring boot server仍然是无限调用,当我从useeffect打印数据时,控制台上也会显示一个无限的对象。

这是我的代码,希望你能提出解决方案;em

 const [filterKeywords, setfilterKeywords] = useState([]);

    const [companies, setCompanies] = useState([]);
    useEffect(() => {
        axios.get(`/api/users/allCompanies`)
            .then(res => {
                setCompanies(res.data);
            })
    });

然后我将它们传递给公司组件

 <Companies
                keywords={filterKeywords}
                data={companies}
                setKeywords={addFilterKeywords}
            />

然后将它们传递给公司组件

return (
        <div className="jobs">
            {(filteredData.map(d => {
                return <Company key={d.id} data={d} setkeywords={setKeywords} />

            }))}
        </div>
    )

【问题讨论】:

    标签: reactjs use-effect use-state


    【解决方案1】:

    将您的 useEffect 代码更改为此。

        useEffect(() => {
            axios.get(`/api/users/allCompanies`)
                .then(res => {
                    setCompanies(res.data);
                })
        },[]);
    

    【讨论】:

    • 修复了无限循环,但是当我刷新页面时,对象消失了,我收到了这个消息错误。 ``` index.js:1 警告:无法对未安装的组件执行 React 状态更新。这是一个空操作,但它表明您的应用程序中存在内存泄漏。要解决此问题,请在 useEffect 清理函数中取消所有订阅和异步任务。在 localhost:3000/static/js/main.chunk.js:33669:81 ``` 。所以你认为是什么问题>它只工作一次,如果我刷新页面或移动到另一个 pge 元素被删除
    【解决方案2】:

    添加 Empty 依赖项......最后像这样

    useEffect(() => {
        axios.get(`/api/users/allCompanies`)
            .then(res => {
                setCompanies(res.data);
            })
    },[]);
    

    【讨论】:

    • 修复了无限循环,但是当我刷新页面时,对象消失了,我收到了这个消息错误。 ``` index.js:1 警告:无法对未安装的组件执行 React 状态更新。这是一个空操作,但它表明您的应用程序中存在内存泄漏。要解决此问题,请在 useEffect 清理函数中取消所有订阅和异步任务。在 localhost:3000/static/js/main.chunk.js:33669:81 ``` 。所以你认为是什么问题>它只工作一次,如果我刷新页面或移动到另一个 pge 元素删除@Udit
    【解决方案3】:

    您的useEffect 中没有任何回调,这就是它执行无穷大的原因。

    你可以像[]这样添加数组,或者你可以在你的数组中添加回调触发器,那么你就不会再遇到这个问题了

       useEffect(() => {
                axios.get(`/api/users/allCompanies`)
                    .then(res => {
                        setCompanies(res.data);
                    })
            },[]);
    

    【讨论】:

    • 修复了无限循环,但是当我刷新页面时,对象消失了,我收到了这个消息错误。 ``` index.js:1 警告:无法对未安装的组件执行 React 状态更新。这是一个空操作,但它表明您的应用程序中存在内存泄漏。要解决此问题,请在 useEffect 清理函数中取消所有订阅和异步任务。在 localhost:3000/static/js/main.chunk.js:33669:81 ``` 。所以你认为是什么问题>它只工作一次,如果我刷新页面或移动到另一个 pge 元素删除@Evren
    【解决方案4】:

    这是你需要做的。

    const [filterKeywords, setfilterKeywords] = useState([]);
    const [companies, setCompanies] = useState([]);
    useEffect(async () => {
            await axios.get(`/api/users/allCompanies`)
                .then(res => {
                    setCompanies(res.data);
            })
    },[]);
    
    

    当您调用api 时,您应该使用async 等待,但这并不是您缺少inifinity 循环的原因[]

    选项 2:

    const [filterKeywords, setfilterKeywords] = useState([]);
    
    const [companies, setCompanies] = useState([]);
    useEffect(() => {
           (async ()=>{
                 const {data} = await axios.get(`/api/users/allCompanies`)
                 setCompanies(data);
           })();
    },[]);
    
    

    【讨论】:

    • 修复了无限循环,但是当我刷新页面时,对象消失了,并且我收到了这个消息错误 ``` index.js:1 警告:无法对未安装的组件执行 React 状态更新。这是一个空操作,但它表明您的应用程序中存在内存泄漏。要解决此问题,请在 useEffect 清理函数中取消所有订阅和异步任务。在localhost:3000/static/js/main.chunk.js:33669:81```所以你认为是什么问题
    猜你喜欢
    • 2020-08-19
    • 2020-04-21
    • 2021-04-29
    • 2021-08-28
    • 2020-10-16
    • 2020-02-22
    • 2020-07-24
    • 2021-01-22
    • 2021-01-31
    相关资源
    最近更新 更多