Я работаю над созданием приложения redux, и мне нужны данные из моей базы данных, чтобы они попали в мое хранилище redux после загрузки определенного компонента. Однако мне нужно, чтобы это происходило каждый раз, когда пользователь добавляет новые данные. В настоящее время я могу либо получить данные для первоначальной загрузки, передав в свой эффект пустой массив зависимостей, но это останавливает обновление данных на основе действий пользователя (вам придется обновить страницу, чтобы эффект снова запустился). Но если я добавлю данные в свой массив зависимостей, это вызовет бесконечный цикл, потому что эффект изменит данные, которые наблюдаются в массиве зависимостей. Ниже представлен текущий поток моего кода.
useEffect
отправляет действие изMarkerList
компонента.- Действие Redux извлекает данные из Firestore и отправляет действие редуктору.
- Редуктор обновляет состояние с помощью полезной нагрузки из Firestore.
Я не знаю, как правильно заставить мой эффект срабатывать каждый раз, когда добавляется новый маркер. Если я не могу отслеживать свои данные в массиве зависимостей из-за бесконечного цикла, как я должен отслеживать изменения данных и повторно запускать эффект?
Я попытался настроить onSnapshot
прослушиватель firestore, но это не очень хорошо работает с redux. Я попытался использовать пустой массив зависимостей, как указывалось ранее, который правильно извлекает данные в первый раз, но не обновляет мой пользовательский интерфейс при добавлении новых данных без обновления страницы. Очевидно, что отслеживание маркеров в массиве зависимостей вызывает бесконечный цикл.
Эффект в компоненте
useEffect(() => {
const loadMarkers = async () => {
props.loadMarkers();
};
loadMarkers();
}, []);
Redux Action
export function loadMarkers() {
let markers = [];
return dispatch => {
getMarkersFromDB().then(snap => {
snap.forEach(doc => {
markers.push(doc.data());
});
dispatch({
type: constants.LOAD_MARKERS,
payload: markers
});
});
};
}
loadMarkers
? Для меня имеет смысл начинатьloadMarkers
, когда компонент монтируется, но мне неясно, что еще может сигнализировать о появлении новых маркеров. Вы можете опрашивать и вызыватьloadMarkers
через интервал, или вам нужен какой-нибудь слушатель, чтобы запускатьloadMarkers
, когда вы знаете, что есть новый. - person azundo   schedule 04.12.2019