Как предотвратить перезагрузку всего компонента при обновлении некоторых документов firestore?

#reactjs #firebase #google-cloud-firestore #drag-and-drop

#reactjs #firebase #google-cloud-firestore #перетаскивание

Вопрос:

Я пытаюсь создать список дел перетаскивания … После каждого перетаскивания позиция каждого элемента обновляется в firebase…Это функция, выполняющая это

 unfinishedTodos.forEach((each, index) => {
 firebaseApp.firestore().collection("todos").doc(each.id).update({
   index: index})
});
 

Но после запуска функции обновления весь компонент перезагружается..Проблема в том, что, поскольку в списке много элементов, мне приходится снова прокручивать, чтобы найти элемент, с которым я работал…Я хочу убедиться, что документы firestore обновляются, но страница не должна перезагружаться … Как я могу предотвратить эту перезагрузку?
Обновление:
Я выяснил, что пошло не так…На самом деле я использовал функцию onSnapshot firebase…So при каждом изменении он срабатывал и перезагружал данные…

Комментарии:

1. Не могли бы вы показать весь компонент, где вы это делаете? Это должно быть довольно просто, но будет полезно увидеть контекст этого.

Ответ №1:

React обновляет компонент всякий раз, когда изменяется какая-либо state или props переменная.

Итак, чтобы предотвратить повторный рендеринг условно, вы можете использовать эту функцию жизненного цикла (возврат false означает предотвращение повторного рендеринга):

компонент класса

 shouldComponentUpdate(prevState, prevProps) {
    if (this.state.someVariable !== prevState.someVariable || 
        this.props.someVariable !== prevProps.someVariable) {
        return false;
    }

    return true;
}
 

функциональный компонент

 React.memo(MyComponent, (props, nextProps)=> {
    if(this.state.someVariable !== prevState.someVariable) {
        // if don't re-render/update
        return true
    }

    //...
})
 

Комментарии:

1. Но я использую функциональный компонент, а не компонент класса.. Как мне изменить ваш код, если это так

2. добавил это в мой ответ

3. Эй, но я не понимаю, при обновлении базы данных firebase firestore я не изменяю какое-либо состояние или реквизиты текущего компонента… Итак, в чем причина повторного рендеринга всего компонента?

4. Ну, очевидно, что если вы измените данные, на которые «подписано» ваше приложение, компоненты повторно отобразятся. Очевидно, что эта «подписка» должна означать передачу данных через реквизиты, под капотом (все в React передается таким образом). Извините, я не могу быть более конкретным, поскольку я не знаю firebase