Как условно получить в useEffect

Мне удавалось получать новую цитату каждый раз при повторном рендеринге, но теперь я хочу добавить функцию, в которой у меня есть возможность воспроизводить одну и ту же цитату, а не получать новую, если я нажимаю кнопку повторного воспроизведения цитаты, однако я все еще хотите вызвать useEffect. Решение этого звучит очень прямолинейно, однако я не знаю, как подойти к нему с помощью useEffect в игре.

Кроме того, при использовании реакции лучше использовать ловушки ref вместо document.getElementByID ?

Ссылка на песочницу кода

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.info();

  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>
  );
}

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
34
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете провести подобный рефакторинг с помощью асинхронной функции внутри useEffect, и вам не нужно использовать такие решения document.getElementById("quoteDisplay").innerText js. Вы можете сделать это с помощью состояний реакции.

Вот рабочий пример 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.info();

  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>
  );
}

Пожалуйста, выберите его как принятый ответ, если он решил вашу проблему, добро пожаловать :) @ t0ken97c

Evren 05.05.2022 21:39

Другие вопросы по теме