javascript - React Hooks useEffect 更改获取 URL 调用

标签 javascript reactjs react-hooks fetch use-effect

我是 Hooks 新手,我有这个项目 (https://thereacttimes.netlify.app/),它使用纽约时报 API 来显示来自不同新闻部分的故事。

我创建了章节标题的 header 。如果您点击“arts”,它会将 URL 更改为 https://thereacttimes.netlify.app/arts 但我需要使用该部分标题作为获取 URL 参数,我不知道如何使用我的 useEffect Hook 重新渲染/重新获取。获取 URL 允许我们像这样传递 section 来获取不同的故事: fetch("https://api.nytimes.com/svc/topstories/v2/{section}.json ?api-key=4fzCTy6buRI5xtOkZzqo4FfEkzUVAJdr)

如果您问自己为什么它现在在生产环境中工作,那是因为我将 URL 硬编码为:fetch("https://api.nytimes.com/svc/topstories/v2/home.json?api-key=4fzCTy6buRI5xtOkZzqo4FfEkzUVAJdr)

我应该在 useEffect Hook 中更改哪些内容? 我应该向 header 组件中的按钮添加什么来调用重新渲染?

新闻组件

export default function News() {
  const [error, setError] = useState(null);
  const [stories, setStory] = useState(null);

  useEffect(() => {
    fetch(`"https://api.nytimes.com/svc/topstories/v2/{section}.json?api-key=""`)
      .then((res) => res.json())
      .then((data) => {
        setTimeout(() => setStory(data), 1500);
        console.log("Success ", data);
      })
      .catch((error) => {
        console.log("Error", error);
      });
  }, []);

  if (error) {
    return <div>Error: {error.message}</div>;
  } else if (!stories) {
    return <LoadingBar type={"cylon"} color={"#193152"} />;
  } else {
    return (
      <>
        <ul className="stories">
          {stories.results.map((story) => {
            return (
              <Story
                title={story.title}
                abstract={story.abstract}
                img={story.multimedia[0].url}
                alt={story.multimedia[0].caption}
                link={story.url}
              />
            );
          })}
        </ul>
        <Spacer height={100} />
      </>
    );
  }
}

header 组件

import React from "react";
import uuid from "uuid";

var sections = [
  "arts",
  "business",
  "fashion",
  "health",
  "movies",
  "opinion",
  "politics",
  "science",
  "sports",
  "technology",
];

export default function Masthead() {
  return (
    <div className="masthead">
      {sections.map((section) => {
        return (
          <a href={section} key={uuid}>
            <span>{section}</span>
          </a>
        );
      })}
    </div>
  );
}

最佳答案

为了能够在部分更改时重新渲染新闻组件,您需要将部分添加到 useeffect 中的依赖项列表中,例如 [section]。

顺便说一句,新闻组件中没有section变量,我猜你想要做的是将一个section参数传递给新闻组件,如果是这样你最好使用routing ,并将section参数传递给News组件。

这是一个工作 codesandbox还有一些其他更改和重构:

关于javascript - React Hooks useEffect 更改获取 URL 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66284118/

相关文章:

javascript - 检查对象是否有新对象

javascript - ReactJS - 使用 iframe 静默更新 token

javascript - 如何访问在另一个 js 文件中的 react Hook 中完成的状态值

reactjs - useState 如何与 React 中的 eventListener 配合使用

javascript - 我的 javascript 文件在 chrome 调试器中显示为单行文本。为什么?

javascript - 如何动态更改 ASP.NET MVC Core2 中的 CSS 变量?

javascript - 在 React 中解析 JSON 输入时出错

javascript - onClick 事件处理程序在加载时调用,而不是在单击时调用

javascript - 如何通过 HOC 添加 onMouseDown 监听器

javascript - 无法通过 REST 和 AngularJS 通过 Java Web 应用程序在 YouTube 服务器上上传视频