Совершить действие, если состояние не обновлялось

Идея такая. Если несколько чекбоксов, они записываются в состояние и далее отправляются на сервер. Что-бы избежать добавления кнопки "Сохранить" , было принято решение добавить автоматическое сохранение и отправка данных на сервер, если пользователь не меняет ничего в течении 1-2 секунд(чтобы не перегружать сервер и в частности БД запросами)

Была идея использовать componenDidUpdate + setTimeout, но вместе оно работать не хочет.

componentDidUpdate(prevProps, prevState, snapshot) {
        Settings.timer = null;
        clearTimeout(Settings.timer);
        Settings.timer = setTimeout(function() {
            console.log("1 seconds of no clicking");
            Settings.timer = null;
        }, 1000);
        
    }
    static timer = null;

Как такое можно реализовать?


Ответы (1 шт):

Автор решения: SwaD

Можно сделать такую реализацию следующим образом

Объявляем переменную в компоненте, но не в состоянии

this.timer = 0;

Создаем метод, который будет вызываться при каждом изменении состояния компонента

willUpdateDb() {
    clearTimeout(this.timer); // Сбросить таймер(если есть)
    this.timer = setTimeout(() => { // Запустить новый
        console.log('updateDB '); // - Если за 2сек ничего не поменялось, сохранится
    }, 2000);
}

componentDidUpdate(prevProps, prevState, snapshot) {
    this.willUpdateDb();
}

Когда данные не меняются, нет смысла дергать БД, данные же остались прежними.

Таким образом, сохранение данных в БД будет тогда, когда от момента последнего изменения состояния прошло 2сек(Ну или ваш нужный интервал)

→ Ссылка