我可以在每次重新渲染时获取一个新的引用,但现在我想添加一个功能,在这个功能中,如果我按下replay quote按钮,我可以 Select 重播相同的引用,而不获取新的引用,但是我仍然想调用useEffect.这个问题的解决方案听起来非常直截了当,然而,我不知道如何在发挥效用的情况下处理它.

此外,在使用react时,最好使用ref hook,而不是document.getElementByID?

Code SandBox Link

import "./styles.css";
import { useEffect, useState } from "react";

async function newQuote() {
  const response = await fetch("https://api.quotable.io/random");
  const data = await response.json();

  return data.content;
}

async function genQuote() {
  document.getElementById("quoteDisplay").innerText = await newQuote();
}

export default function App() {
  const [quote, fecthNewQuote] = useState(0);

  useEffect(() => {
    genQuote();

    document.getElementById(
      "newQuoteCounter"
    ).innerText = `New Quote Counter: ${quote}`;

    document.getElementById("quoteReplayedCounter").innertext = ``;
  }, [quote]);

  console.log();

  return (
    <div className="App">
      <div id="quoteDisplay"></div>
      <div id="newQuoteCounter">New Quote Counter: 0</div>
      <div id="quoteReplayedCounter"> Quote Replayed Counter: 0 </div>
      <button id="newQuoteButton" onClick={() => fecthNewQuote((c) => c + 1)}>
        Fetch New Quote
      </button>
      <button id="keepSameQuote">Keep Same Quote</button>
    </div>
  );
}

推荐答案

你可以在useEffect中使用async函数进行这样的重构,而不需要使用这些document.getElementById("quoteDisplay").innerText js解决方案.你可以用react 状态来做.

下面是工作示例https://codesandbox.io/embed/distracted-shamir-sfinbd?fontsize=14&hidenavigation=1&theme=dark

import "./styles.css";
import { useEffect, useState } from "react";

export default function App() {
  const [quote, fecthNewQuote] = useState(0);
  const [display, setDisplay] = useState("");

  useEffect(() => {
    async function newQuote() {
      const response = await fetch("https://api.quotable.io/random");
      const data = await response.json();
      setDisplay(data.content);
    }
    newQuote();
  }, [quote]);

  console.log();

  return (
    <div className="App">
      <div id="quoteDisplay">{display}</div>
      <div id="newQuoteCounter">New Quote Counter: {quote}</div>
      <div id="quoteReplayedCounter"> Quote Replayed Counter: 0 </div>
      <button id="newQuoteButton" onClick={() => fecthNewQuote(quote + 1)}>
        Fetch New Quote
      </button>
      <button id="keepSameQuote">Keep Same Quote</button>
    </div>
  );
}

Javascript相关问答推荐

React Native平面列表自动滚动

如何找出摆线表面上y与x相交的地方?

如何从一个列表中创建一个2列的表?

Mongoose post hook在使用await保存时不返回Postman响应

如何从Intl.DateTimeFormat中仅获取时区名称?

Use Location位置成员在HashRouter内为空

使用VUE和SCSS的数字滚动动画(&;内容生成)

Puppeteer上每页的useProxy返回的不是函数/构造函数

JavaScript不重定向配置的PATH

Next.js中的服务器端组件列表筛选

使用自动识别发出信号(&Q)

Phaser3 preFX addGlow不支持zoom

为列表中的项目设置动画

如何在尚未创建的鼠标悬停事件上访问和着色div?

JavaScript:多个图像错误处理程序

JQuery使用选项填充HTMLSELECT并设置默认结果,默认结果显示为空

如何使pdf.js上的文本呈现为可选?

Refine.dev从不同的表取多条记录

material UI自动完成全宽

如何在单击Search按钮时更新Reaction组件?