Middle+
// Необходимо да изнесем логиката за повторно рендериране в отделен външен hook, // който да позволява работа с таймера отвън (например, да го спре след 10 секунди). // Трябва да се създаде нов компонент RandOnce на базата на компонента Rand, // който при използване в App // няма да обновява случайното число всеки път, когато минат 3 секунди, а ще показва случайно число само веднъж.
sobes.tech AI
Отговор от AI
Для решения задачи нужно вынести логику перерендеринга с таймером в отдельный кастомный хук, который будет возвращать текущее случайное число и методы управления таймером (например, остановку). Затем на его основе сделать компонент RandOnce, который вызовет хук, но не будет запускать обновление по таймеру, а выведет число один раз.
Пример реализации:
import React, { useState, useEffect, useRef } from 'react';
// Хук с таймером для обновления случайного числа
function useRandomTimer(interval = 3000) {
const [random, setRandom] = useState(Math.random());
const timerId = useRef(null);
useEffect(() => {
timerId.current = setInterval(() => {
setRandom(Math.random());
}, interval);
return () => clearInterval(timerId.current);
}, [interval]);
const stop = () => {
if (timerId.current) {
clearInterval(timerId.current);
timerId.current = null;
}
};
return { random, stop };
}
// Компонент Rand — обновляет число каждые 3 секунды
export function Rand() {
const { random } = useRandomTimer(3000);
return <div>{random}</div>;
}
// Компонент RandOnce — выводит число один раз, без обновлений
export function RandOnce() {
const [random] = useState(Math.random());
// Можно использовать хук без запуска таймера или просто не использовать хук
return <div>{random}</div>;
}
// Если нужно, можно сделать useRandomTimer с опцией, чтобы не запускать таймер
function useRandomTimerControlled(interval = 3000, start = true) {
const [random, setRandom] = useState(Math.random());
const timerId = useRef(null);
useEffect(() => {
if (!start) return;
timerId.current = setInterval(() => {
setRandom(Math.random());
}, interval);
return () => clearInterval(timerId.current);
}, [interval, start]);
const stop = () => {
if (timerId.current) {
clearInterval(timerId.current);
timerId.current = null;
}
};
return { random, stop };
}
// Тогда RandOnce можно сделать так:
export function RandOnceControlled() {
const { random } = useRandomTimerControlled(3000, false); // таймер не запускается
return <div>{random}</div>;
}
Таким образом, логика обновления вынесена в хук, который можно контролировать извне, а компонент RandOnce выводит число один раз без обновлений.