为什么React钩子useEffect无限运行?

zwl*_*619 2 reactjs

我使用create-react-app创建了一个项目,
并尝试使用React挂钩,
在下面的示例中,
该语句console.log(articles)不断运行:

import React, {useState, useEffect} from "react"
import {InfiniteScroller} from "react-iscroller";
import axios from "axios";
import './index.less';

function ArticleList() {
    const [articles, setArticles] = useState([]);

    useEffect(() => {
        getArticleList().then(res => {
           setArticles(res.data.article_list);
            console.log(articles);  
        });
    },[articles]);

    const getArticleList = params => {
        return axios.get('/api/articles', params).then(res => {
            return res.data
        }, err => {
            return Promise.reject(err);
        }).catch((error) => {
            return Promise.reject(error);
        });
    };


    let renderCell = (item, index) => {
        return (
            <li key={index} style={{listStyle: "none"}}>
                <div>
                    <span style={{color: "red"}}>{index}</span>
                    {item.content}
                </div>
                {item.image ? <img src={item.image}/> : null}
            </li>
        );
    };

    let onEnd = () => {
        //...
    };


    return (
        <InfiniteScroller
            itemAverageHeight={66}
            containerHeight={window.innerHeight}
            items={articles}
            itemKey="id"
            onRenderCell={renderCell}
            onEnd={onEnd}
        />
    );
}

export default ArticleList;
Run Code Online (Sandbox Code Playgroud)

为什么?如何处理?

https://i.stack.imgur.com/SHLjh.gif

小智 5

React useEffect将第二个参数与其先前的值进行比较,以您的情况为准。但是在javascript中比较对象的结果始终为假,请尝试在浏览器控制台中比较[] === [],您将得到假。因此,解决方案是不比较整个对象,而是比较articles.lenght

const [articles, setArticles] = useState([]);

useEffect(() => {
    getArticleList().then(res => {
       setArticles(res.data.article_list);
        console.log(articles);  
    });
},[articles.length]);
Run Code Online (Sandbox Code Playgroud)