(Реагировать) Дочерний компонент приостанавливает свое использование Эффект, когда родительский повторный рендеринг

Обновлено: эта проблема была решена путем добавления второго параметра в хуки useEffect.

Я новичок в реакции и создаю игрушечную игру React. Я позаимствовал этот таймер, нашел здесь. Если пользователь выполняет действие и родительский компонент выполняет повторный рендеринг, таймер прекращает отсчет на короткий период времени. Согласно (https://reactjs.org/docs/hooks-effect.html), response запомнит функцию useEffect и вызовет ее позже после выполнения обновлений DOM. Если это причина, есть ли какие-либо решения или альтернативы этому? Если нет, может ли кто-нибудь указать мне правильное направление? Любая помощь будет оценена по достоинству!

Вот мой фрагмент кода для справки:

class Chalkboard extends Component {
    constructor(props) {
        super(props);
        this.state = {
            minutes: 1,
            seconds: 0,
            addSeconds: 0,
        };
    }

    updateTimer() {
        this.setState({ addSeconds: 0 });
    }

    handleTimer() {
        window.removeEventListener('keydown', this.keyHandling);
        this.setState({
            gameOver: true,
        });
    }

    render() {
       return(
           <Timer
                initialMinutes = {this.state.minutes}
                initialSeconds = {this.state.seconds}
                onTimer = {this.handleTimer}
                addSeconds = {this.state.addSeconds}
                updateTimer = {this.updateTimer}
            />
           )

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

const Timer = (props) => {
    const { initialMinutes = 0, initialSeconds = 0 } = props;
    const [minutes, setMinutes] = useState(initialMinutes);
    const [seconds, setSeconds] = useState(initialSeconds);

    useEffect(() => {
        let myInterval = setInterval(() => {
            if (seconds > 0) {
                setSeconds(seconds - 1);
            }
            else if (seconds === 0) {
                if (minutes === 0) {
                    clearInterval(myInterval);
                } else {
                    setSeconds(59);
                    setMinutes(minutes - 1);
                }
            }
        }, 1000);
        return () => {
            clearInterval(myInterval);
        };
    });

    useEffect(() =>{
        if (props.addSeconds>0){
            setSeconds(seconds + props.addSeconds);
            props.updateTimer()
        }
        if (minutes === 0 && seconds === 0){
            props.onTimer()
        }
    });


    return (
        <div className = "timer-container" >
            {minutes === 0 && seconds === 0 ? null: (
                <div>
                    {' '}
                    {minutes}:{seconds < 10 ? `0${seconds}` : seconds}
                </div>
            )}
        </div>
    );
};

export default Timer;

вы используете ловушку useEffect в компоненте класса?

antoineso 30.03.2021 10:28

можешь показать нам еще немного кода?

antoineso 30.03.2021 10:30

Я не понимаю, что вы имели в виду, когда сказали timer stop counting down. Это сбрасывается и начинается с самого начала или просто приостанавливается на определенный период, а затем продолжается оттуда.? Больше кода поможет

Pavan 30.03.2021 12:45

Извините, я обновил свой вопрос.

Charlotte Cheng 30.03.2021 21:45

Да, таймер приостановил на некоторое время, а затем продолжил с этого момента. И если я продолжу нажимать кнопку, которая заставляет родительский элемент повторно отрисовывать, таймер приостанавливается навсегда.

Charlotte Cheng 30.03.2021 21:49
Поведение ключевого слова "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) для оценки ваших знаний,...
0
5
40
1

Ответы 1

Вы можете привести пример на https://codesandbox.io/?

Попробуйте передать [props, minutes, seconds] в качестве второго параметра в хуке useEffect. https://reactjs.org/docs/hooks-reference.html#conditional-firing-an-effect

Добавление [props.addSeconds, minutes, seconds] в качестве второго параметра в ловушку useEffect решило мою проблему! Большое спасибо.

Charlotte Cheng 30.03.2021 23:37

@CharlotteCheng, если ваша проблема решена, отметьте ответ и проголосуйте за него, чтобы другие тоже могли воспользоваться этим.

M.A Shahbazi 31.03.2021 01:51

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