为了账号安全,请及时绑定邮箱和手机立即绑定

我的反应按钮不起作用 - 我使用 useState 和 useEffect

我的反应按钮不起作用 - 我使用 useState 和 useEffect

jeck猫 2022-10-27 14:39:34
我不确定为什么我的 Button 不起作用,我使用 useState 和 useEffect这是我的代码:    import React, { useState, useEffect } from "react";    // import Timeout from "await-timeout";    import axios from "axios";        export default function Dogs() {      const [dog, set_Dog] = useState(" ");      console.log({ dog });          useEffect(() => {        async function getFetch() {          const res = await axios.get("https://dog.ceo/api/breeds/image/random");          const {            data: { message },          } = res;          console.log("Got back", message);          set_Dog(message);        }        getFetch();      }, []);          function output() {        set_Dog(dog);        // console.log(set_Dog({ dog }));      }      return (        <div>          <h2>If you like Dogs,{dog} Press Button</h2>          <button onClick={output}>Click me</button>          {dog}          <img src={dog} />        </div>      );    }`当我点击按钮图像消失时,我想在不刷新浏览器的情况下显示狗的新图像
查看完整描述

3 回答

?
慕村225694

TA贡献1880条经验 获得超4个赞

由于过时的闭包dog,函数中设置的值永远output不会改变。


因为您想要填充状态mount并在用户单击按钮时对其进行更改,所以您必须在函数范围内创建调用 API 的函数并用 记忆它useCallback,相同的函数可以传递给onClick. 例如,


export default function Dogs() {

  const [dog, set_Dog] = useState("");

  console.log({ dog });


  const getDogPic = useCallback(async () => {

    const res = await axios.get("https://dog.ceo/api/breeds/image/random");

    const {

      data: { message }

    } = res;

    console.log("Got back", message);

    set_Dog(message);

  }, []);


  useEffect(() => {

    getDogPic();

  }, []);


  return (

    <div>

      <h2>If you like Dogs,{dog} Press Button</h2>

      <button onClick={getDogPic}>Click me</button>

      {dog}

      <img src={dog} alt={"dog-pic"} />

    </div>

  );

}

Codesandbox中的工作演示

阅读有关过时关闭的更多信息


查看完整回答
反对 回复 2022-10-27
?
四季花海

TA贡献1811条经验 获得超5个赞

获取第一张图像后,您可以使用useRef保留对您的函数的引用。


const click_ref = React.useRef(null);

useEffect(() => {

    async function getFetch() {

      const res = await axios.get("https://dog.ceo/api/breeds/image/random");

      const {

        data: { message },

      } = res;

      console.log("Got back", message);

      set_Dog(message);

    }

    getFetch();

    click_ref.current = getFetch;

  }, []);

<button onClick={() => click_ref.current()}>Click me</button>


查看完整回答
反对 回复 2022-10-27
?
慕容3067478

TA贡献1773条经验 获得超3个赞

尝试 : onClick={() => output()}

就像它只在您单击按钮时呈现,而不是在每次组件重新呈现时呈现。


查看完整回答
反对 回复 2022-10-27
  • 3 回答
  • 0 关注
  • 187 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信