Почему цикл for считает один и тот же индекс дважды?

у меня странная проблема с React и функцией тайм-аута. По какой-то причине я хочу, чтобы к букве useEffect добавлялась строка. Итак, я написал этот код:

const [placeholder, setPlaceholder] = useState < string > ('')

useEffect(() => {
    const str = "How may I help you today?";
    const letters = Array.from(str);

    const addLetterWithDelay = (index: number) => {
        if (index < letters.length) {
            setTimeout(() => {
                setPlaceholder(prevPlaceholder => prevPlaceholder + letters[index]);
                addLetterWithDelay(index + 1);
            }, 1000); // Delay of 1 second
        }
    };

    addLetterWithDelay(0); // Start adding letters from index 0
}, []);

Проблема в том, что буква устанавливается дважды Таким образом, вывод будет таким: HHooww mmaayy II hheellpp yyououu ttooddaayy?? даже если я проверю с помощью оператора, совпадает ли последний символ заполнителя с буквами [индекс] или нет, он все равно печатает, что это не то же самое, и продолжает выполнение

по сути, ваша функция обновления состояния prevPlaceholder => prevPlaceholder + letters[index] не является чистой функцией. Он должен быть чистым, чтобы всегда возвращать одно и то же значение при одних и тех же входных данных.

Nick Parsons 07.04.2024 06:35
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
2
80
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Измените свой useEffect на:

 useEffect(() => {
    const str = "How may I help you today?";
    const letters = Array.from(str);
    let timerId: NodeJS.Timeout; // Declare a variable to hold the timeout ID

    const addLetterWithDelay = (index: number) => {
        if (index < letters.length) {
            timerId = setTimeout(() => {
                setPlaceholder(prevPlaceholder => prevPlaceholder + letters[index]);
                addLetterWithDelay(index + 1);
            }, 1000); // Delay of 1 second
        }
    };

    addLetterWithDelay(0); // Start adding letters from index 0

    return () => clearTimeout(timerId); // Clear the timeout when the component is unmounted or the useEffect hook re-runs
}, []);

Таким образом, если ваш компонент выполняет повторную визуализацию и перехватчик useEffect вызывается снова, текущий тайм-аут очищается и метод addLetterWithDelay завершается.

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