我试图显示数组项中当前值的img,但在加载时,当我提交我的值时,图像不显示.我提交了两次以显示该值.当更改值并按下Submit时,div不会用新值更新内容,而是重复旧的值.再次提交后,div将更新为新值.

export default function Ingredients() {
  const [form, setForm] = useState("");
  const [theimg, setheimg] = useState({
    name: "",
    url: "",
    id: "",
  });
  const [imgArr, setImgArr] = useState([]);

  function handleChange(e) {
    setForm(e.target.value);
  }

  function getImg() {
    const options = {
      method: "GET",
      headers: {
        "X-RapidAPI-Key": "29a63a7413msh8378b61a2e11cf3p192e62jsn53d83f1651fe",
        "X-RapidAPI-Host": "edamam-food-and-grocery-database.p.rapidapi.com",
      },
    };
    fetch(
      `https://edamam-food-and-grocery-database.p.rapidapi.com/parser?ingr=${form}`,
      options
    )
      .then((response) => response.json())
      .then((response) =>
        setheimg((prevImg) => ({
          ...prevImg,
          name: form,
          url: response.parsed[0].food.image,
          id: Math.random(),
        }))
      )
      .catch((err) => console.error(err));
  }

  const thingsElements = imgArr.map((thing) => (
    <div key={thing.id}>
      <img src={thing.url} />
      <p>{thing.name}</p>
    </div>
  ));

  return (
    <>
      <Navbar page="/" />
      <Heading heading="Ingredients" info="Search by etc" />
      <Form
        label="Search Ingredients..."
        onChange={handleChange}
        value={form.value}
        imgsrc={theimg}
      />
      <button
        onClick={() => {
          getImg();
          setImgArr((oldArray) => {
            return [...oldArray, theimg];
          });
        }}
      >
        Search
      </button>
      {thingsElements}
    </>
  );
}
const Form = (props) => {
  return (
    <>
      <label>
        {props.label}
        <input value={props.value} onChange={props.onChange} />
      </label>
    </>
  );
};
export default Form;

推荐答案

在您的单击处理程序中,您不必等待getImg()完成后才将theimg添加到数组中.

不如试试这样的东西吧

const getImg = async () => {
  const params = new URLSearchParams({ ingr: form });
  const res = await fetch(`https://example.com/parser?${params}`, {
    method: "GET",
    headers: {
      "X-RapidAPI-Key": "<api-key>",
      "X-RapidAPI-Host": "<host>",
    },
  });

  if (!res.ok) {
    throw res;
  }

  const data = await response.json();
  return {
    name: form,
    url: data.parsed[0].food.image,
    id: Math.random(), // recommend Date.now() instead
  };
};

const clickHandler = async () => {
  try {
    const newImg = await getImg(); // wait for getImg() to resolve
    settheimg(newImg); // set img state
    setImgArr((prev) => [...prev, newImg]); // add it to the array
  } catch (err) {
    console.error(err);
  }
};

在你的<button>...

<button onClick={clickHandler}>Search</button>

Javascript相关问答推荐

深嵌套的ng-container元素仍然可以在Angular 布局组件中正确渲染内容吗?

Rehype将hashtag呈现为URL

为什么我的导航条打开状态没有在窗口addeventlistener(Reaction Js)中更新?

Angular 订阅部分相互依赖并返回数组多个异步Http调用

如何通过将实例方法的名称传递给具有正确类型的参数的继承方法来调用实例方法?

使用原型判断对象是否为类的实例

如何从HTML对话框中检索单选项组的值?

我怎么在JS里连续加2个骰子的和呢?

使用js构造一个html<;ath&>元素并不能使其正确呈现

如何在JAVASCRIPT中合并两组对象并返回一些键

为什么我的按钮没有从&q;1更改为&q;X&q;?

一个实体一刀VS每个实体多刀S

当标题被点击时,如何使内容出现在另一个div上?

未捕获语法错误:Hello World中的令牌无效或意外

Reaction即使在重新呈现后也会在方法内部保留局部值

每隔3个项目交替显示,然后每1个项目交替显示

通过解构/功能组件接收props-prop验证中缺少错误"

Firebase函数中的FireStore WHERE子句无法执行

单击时同时 Select 和展开可访问的行

Select 所有输入.值