Задать вопрос
@Mdmitr

Как сбросить состояние дочерних компонентов?

Как сбросить (обновить) состояние одновременно у двух дочерних компонентов?
ссылка на codesandbox

Нужно по клику на кнопку перезапустить useEffect в обоих компонентах

import React from "react";
import "./styles.css";
import { JokeOne } from "./JokeOne";
import { JokeTwo } from "./JokeTwo";

export default function App() {
  return (
    <div className="App">
      <h1>Hello CodeSandbox</h1>
      <h2>Start editing to see some magic happen!</h2>
      <hr />
      <JokeOne />
      <hr />
      <JokeTwo />
      <hr />
      <button>Обновить шутки</button>
    </div>
  );
}

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

export const JokeOne = () => {
  const [joke, setJoke] = useState("");
  useEffect(() => {
    fetch("https://api.chucknorris.io/jokes/random?category=animal")
      .then((res) => res.json())
      .then((data) => setJoke(data.value));
  }, []);
  return (
    <div>
      <h2>Random Joke One</h2>
      <div>{joke}</div>
    </div>
  );
};


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

export const JokeTwo = () => {
  const [joke, setJoke] = useState("");
  useEffect(() => {
    fetch("https://api.chucknorris.io/jokes/random?category=sport")
      .then((res) => res.json())
      .then((data) => setJoke(data.value));
  }, []);
  return (
    <div>
      <h2>Random Joke Two</h2>
      <div>{joke}</div>
    </div>
  );
};
  • Вопрос задан
  • 142 просмотра
Подписаться 1 Средний Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Frontend-разработка на React
    10 недель
    Далее
  • Академия Эдюсон
    React-разработчик + ИИ
    2 месяца
    Далее
  • Яндекс Практикум
    React-разработчик
    3 месяца
    Далее
Решения вопроса 1
0xD34F
@0xD34F Куратор тега React
Вместо двух вложенных компонентов пусть будет один. Без состояния, только отображение переданных данных:

const Joke = ({ joke, header }) => (
  <>
    <div>
      <h2>{header}</h2>
      <div>{joke?.value}</div>
    </div>
    <hr />
  </>
);

Родительский компонент - создаёт сколько надо экземпляров дочернего компонента, а загрузку данных для них выносим в функцию, которая будет использоваться в эффекте и как обработчик клика по кнопке:

function JokesList({ categories }) {
  const [ jokes, setJokes ] = React.useState([]);

  const getJokes = React.useCallback(() => {
    Promise.all(
      categories.map(n => {
        return fetch(
          `https://api.chucknorris.io/jokes/random?category=${n}`
        ).then(r => r.json());
      })
    ).then(setJokes);
  }, []);

  React.useEffect(getJokes, []);

  return (
    <div>
      {categories.map((n, i) => (
        <Joke joke={jokes[i]} header={`Random ${n} joke`} />
      ))}
      <button onClick={getJokes}>refresh jokes</button>
    </div>
  );
}

https://codesandbox.io/s/happy-edison-86gz7?file=/...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы