const listRef = firebase.database().ref();
const reducer = (state = {}, action) => {
switch (action.type) {
case: "GET_LIST" : {
const { list } = action;
return { list };
};
case: "ADD_ELEMENT" : {
const { elementId } = action;
return { ...state, [elementId]: true };
};
default : return state;
};
};
const getList = list => ({
type: "GET_LIST", list
});
const addElement = elementId => ({
type: "ADD_ELEMENT", elementId
})
const getListFromDb = () =>
async dispatch => listRef.once("value", snap => {
dispatch(
getList(
list
)
);
});
const listenToElementAdded = () =>
async dispatch => listRef.on("child_added", ({ key: elementId }) => {
dispatch(
addElement(
element
)
);
});
const addElementToDb = () =>
async dispatch => dispatch(
addElement(
listRef.push().key
)
);
const Component = ({
list,
getListFromDb,
listenToElementAdded,
addElementToDb
}) => {
useEffect(() => getListFromDb(), []);
useEffect(() => listenToElementsAdded());
return (
<div>
{ Object.keys(list).map(id => <p>{id}</p>) }
<p onClick={addElementToDb}>Add</p>
</div>
);
};
const mapStateToProps = list => ({ list });
const mapStateToProps = {
getListFromDb,
listenToElementAdded,
addElementToDb
};
export default connect(mapStateToProps, mapStateToProps)(Component);
Упрощенный пример выше показывает, что я имею в виду. Вопрос заключается в том, достаточно ли быстры слушатели Firebase, чтобы заменить предварительную диспетчеризацию данных на избыточную?
Если мы хотим создать приложение, в котором мы хотим обновить данные в реальном времени, поступающие извне, слушатели могут помочь. Но если мы предварительно отправляем полученные данные, мы отправляем дважды. Кроме того, если мы используем только слушателей и отсылаем оттуда, это может сделать код и работу с ним намного более чистой. Но что если у нас будет много данных внутри базы данных? Слушатели будут быстрыми? Эффективно ли обрабатывать диспетчеризацию только через слушателей или стоит предварительно выполнить диспетчеризацию на месте?