You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React useEffect依赖数组未含newsData,为何该状态出现黄色波浪线?

newsData状态出现黄色波浪线的原因及解决办法

你的代码

import axios from "axios";
import { useState, useEffect } from "react";

import NewsItem from "../news-item/NewsItem";

const options = {
  method: "GET",
  url: "https://crypto-news11.p.rapidapi.com/cryptonews/bitcoin",
  params: {
    max_articles: "10",
    last_n_hours: "48",
    top_n_keywords: "10",
  },
  headers: {
    "X-RapidAPI-Key": "d8ef886044msh41d845fa9acd63ep1eb825jsnc6ceabb1a308",
    "X-RapidAPI-Host": "crypto-news11.p.rapidapi.com",
  },
};

const NewsList = () => {
  const [newsData, setnewsData] = useState([]);
  const [isLoading, setIsLoading] = useState(false);
  const [url, setUrl] = useState(
    `https://crypto-news11.p.rapidapi.com/cryptonews/bitcoin`
  );

  const fetchBitcoin = () => {
    setUrl(`https://crypto-news11.p.rapidapi.com/cryptonews/bitcoin`);
  };
  const fetchBlockChain = () => {
    setUrl(`https://crypto-news11.p.rapidapi.com/cryptonews/blockchain`);
  };
  useEffect(() => {
    const fetchNews = async () => {
      try {
        setIsLoading(true);
        let { data } = await axios(url, options);
        setnewsData(data.articles);
        console.log(newsData);

        setIsLoading(false);
      } catch (error) {
        throw new Error();
      }
    };
    fetchNews();
  }, [url]);

  return (
    <>
      <button
        className="bg-green-400 text-white py-3 px-4"
        onClick={fetchBitcoin}
      >
        Bitcoin
      </button>
      <button
        className="bg-yellow-400 text-white py-3 px-4"
        onClick={fetchBlockChain}
      >
        BlockChain
      </button>
      <NewsItem news={newsData} loading={isLoading} />
    </>
  );
};

export default NewsList;

原因分析

黄色波浪线是ESLint的react-hooks/exhaustive-deps规则给出的提示:你在useEffect内部的fetchNews函数里调用了console.log(newsData),但newsData并没有被加入到useEffect的依赖数组中。

另外要注意,这里的console.log(newsData)其实没有实际意义——因为React的状态更新是异步的,这行代码打印的是更新前的旧状态值,不是你刚通过setnewsData设置的新数据。

解决办法

  • 最推荐:直接删除无效的console.log
    删掉console.log(newsData)这行代码,既解决了ESLint的提示,也去掉了无意义的调试代码。

  • 如果需要查看最新的newsData
    单独加一个监听newsData变化的useEffect:

    useEffect(() => {
      console.log(newsData);
    }, [newsData]);
    

    这样每次newsData更新时,都会打印最新的值,同时符合hooks的依赖规则。

  • 临时禁用ESLint提示(不推荐)
    如果你不想修改代码,可以在useEffect上方加注释禁用该规则,但这只是掩盖问题,不是解决问题:

    // eslint-disable-next-line react-hooks/exhaustive-deps
    useEffect(() => {
      // ... 原代码
    }, [url]);
    

内容的提问来源于stack exchange,提问作者Majid Ali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 06:15:36