数据不会显示Next JS

6qftjkof  于 2023-08-04  发布在  其他
关注(0)|答案(2)|浏览(121)

我正在尝试显示来自this API的数据。
下面是我的显示数据的代码:

"use client";

import { SearchIcon } from '@heroicons/react/outline'
import React, { useEffect, useState } from 'react'
import News from './News'
import Image from 'next/image';

export default function Widgets({randomUsersResults}) {

  const [showPosts, setShowPosts] = useState()

  let displayNews;
  const URL = "https://saurav.tech/NewsAPI/top-headlines/category/technology/us.json";

  async function fetchData() {
    const newsData = await fetch(URL);
    const newsResults = await newsData.json();
    console.log(newsResults)
    displayNews = newsResults?.map(function(todo) {
      return(
        <p key={todo.id}>{todo.title}</p>
      )
    })
    setShowPosts(displayNews)
  }

  useEffect(() => {
    fetchData();
  }, [])
  

  const [articleNum, setArticleNum] = useState(3);

字符串
这是HTML代码:

<div className="text-gray-700 space-y-3 bg-gray-100 rounded-xl pt-2 w-[90%] xl:w-[75%]">
    <h4 className="font-bold text-xl px-4">What's happening</h4>
    {showPosts}
    <button onClick={() => setArticleNum(articleNum + 3)} className="text-blue-300 pl-4 pb-3 hover:text-blue-400">
        Show more
    </button>
</div>


Tt应该显示数据,但我得到这个错误:

的数据

mrphzbgm

mrphzbgm1#

这是你的API响应。

的数据

**错误1:**根据图像,newResults实际上是一个对象,newResults.articles是实际的数组。
**错误2:**千万不要像这里一样将Html代码保存在usestate变量中:

displayNews = newsResults?.map(function(todo) {
      return(
        <p key={todo.id}>{todo.title}</p>
      )
    })
    setShowPosts(displayNews)

字符串
现在这段代码应该是:

displayNews = newsResults.articles;
setShowPosts(displayNews)


HTML代码应该是

<div className="text-gray-700 space-y-3 bg-gray-100 rounded-xl pt-2 w-[90%] xl:w-[75%]">
    <h4 className="font-bold text-xl px-4">What's happening</h4>
    {showPosts && showPosts.map((todo,index)=> <p key={todo.id}>{todo.title}</p>)}
    <button onClick={() => setArticleNum(articleNum + 3)} className="text-blue-300 pl-4 pb-3 hover:text-blue-400">
        Show more
    </button>
</div>

y3bcpkx1

y3bcpkx12#

你的React Widgets组件整体看起来不错。但是,我注意到代码中有几个地方可以改进,以获得更好的性能和可维护性。我将提供一些建议来增强您的代码:
1.**解构useState Hook:**在使用 * useState * Hook时,最好先解构state变量和setter函数,以提高代码可读性。
const [showPosts, setShowPosts] = useState();
const [articleNum, setArticleNum] = useState(3);
1.删除未使用的导入:import语句 * useClient * 在代码中没有使用,可以安全地删除。
1.避免创建全局变量:不使用 * let displayNews *,直接在 * fetchData function * 内部使用 * const displayNews *。
1.直接使用async/await:由于 * fetchData * 是一个异步函数,你可以直接在fetch和json调用中使用async/await,使代码更清晰,更容易理解,如下所示:

async function fetchData() {
  try {
    const newsData = await fetch(URL);
    const newsResults = await newsData.json();
    console.log(newsResults);
    const displayNews = newsResults?.map(function (todo) {
      return (
        <p key={todo.id}>{todo.title}</p>
      );
    });
    setShowPosts(displayNews);
  } catch (error) {
    // Handle error, e.g., set a default state for `showPosts`
  }
}

字符串
1.实现错误处理:处理API调用期间可能发生的错误。例如,您可以使用try-catch块来优雅地捕获和处理错误。
1.限制显示的文章数量:考虑使用 * articleNum * 状态来限制 displayNews 列表中显示的文章数量。这样,您可以控制显示的文章数量,而无需像这样修改代码:

const displayedNews = newsResults?.slice(0, articleNum).map(function (todo) {
  return (
    <p key={todo.id}>{todo.title}</p>
  );
});
setShowPosts(displayedNews);


通过合并这些建议,您的Widget组件将得到更优化,更易于维护。请记住要优雅地处理错误,限制显示的文章数量,并解构useState Hook以获得更干净的代码。

相关问题