React:如何使用钩子通过 onClick 刷新组件

React: How to refresh a component with onClick using hooks

我对此很陌生。

作为练习,我做了一个应用程序,它在单击按钮时呈现猫的图像(图像来自 API,效果很好)。

我的想法是让按钮在按下时刷新新图像,我知道我必须使用钩子,但我不确定我是否应该使用 useState、setState 或其他东西。

这是代码

import React, { useState } from "react";
import { CatsGrid } from "./components/CatsGrid";

const RandomCatApp = () => {
  return (
    <div className="catContainer">
      <h1>Random kittens</h1>

      <button onClick={'Some code here'} className="catBtn">
        Generate random kitten
      </button>

      <CatsGrid />
    </div>
  );
};

export default RandomCatApp;

按钮必须刷新组件才能显示来自 API 的新图像。 CatsGrid 组件工作正常,我刚刚对其进行了测试。我的问题是上面代码中的“onClick”和 useState 或其他内容。

这里是 CatsGrid 组件以防万一:

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

export const CatsGrid = () => {
  const [imagen, setImagen] = useState([]);

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

  const getCats = async () => {
    const url = "someApiKey";

    const resp = await fetch(url);

    const data = await resp.json();

    const catImg = data.map((img) => {
      return {
        id: img.id,
        url: img.url,
      };
    });

    setImagen(catImg);
  };

  return (
    <div className="imgContainer">
      {imagen.map(({ id, url }) => (
        <img className="catImg" key={id} src={url} alt="" />
      ))}
    </div>
  );
};

好的,假设 CatsGrid 中的 getCats 中的 fetch 总是 returns 一组新数据,那么我建议只使用 [=13 上的 React 键=] 组件,因此 React 将 unmount/mount 它的一个新实例。当 React 键更改时,React 会将其解释为要呈现的 new 组件。

const RandomCatApp = () => {
  const [catsKey, setCatsKey] = React.useState(0);
  return (
    <div className="catContainer">
      <h1>Random kittens</h1>

      <button
        onClick={() => setCatsKey(key => key + 1)}
        className="catBtn"
      >
        Generate random kitten
      </button>

      <CatsGrid key={catsKey} />
    </div>
  );
};