У меня есть компонент в реакции, который должен загружать исходные данные с помощью некоторых функций, вызываемых внутри, который отправляет данные для редукции из других частей базы данных.Позвонив по номеру once
, я получу свой список и все мои данные настроены.Но я хочу выслушать изменения в списке, но без функций извлечения данных инициализации внутри.Это выглядит так:
const Component = ({
projectId,
setId,
getSet
}) => {
useEffect(() => {
if (setId) {
getSet(projectId, setId);
}
}, [setId]);
//...
//...
const getClassesForElements = (projectId, elements, callback) => {
if (projectId && Array.isArray(elements)) {
const elementsClasses = elements.reduce(
async (classes, elementId) => {
const className = await elementsDb
.child(`${projectId}/${elementId}`)
.once("value", snap => snap.val());
classes[elementId] = className;
return classes;
},
{});
callback && callback(elementsClasses);
return elementsClasses;
}
};
const getClassesAttributes = (projectId, classes, callback) => {
if (projectId && Array.isArray(classes)) {
const classesAttributes = classes.reduce(
async (classes, classId) => {
const attributes = await classesDb
.child(`${projectId}/${classId}`)
.once("value", snap => snap.val());
classes[classId] = attributes;
return classes;
},
{});
callback && callback(classesAttributes);
return classesAttributes;
}
};
export const getSet = (
projectId,
setId
) => (
async dispatch => (
projectId && setId &&
setsDb
.child(`${projectId}/${setId}`)
.once("value", async snap => {
const set = await snap.val();
dispatch(setSet(set));
const elements = Object.keys(set);
//get data from other parts of the database
const elementsClasses = await getClassesForElements(projectId, elements);
dispatch(setElements(elementsClasses));
const classes = Object.values(elementsClasses);
//get data from other parts of the database
const classesAttributes = await getClassesAttributes(projectId, classes);
dispatch(setClasses(classesAttributes));
})
)
);
Так что getClassesForElements
и getClassesAttributes
можно вызвать только один раз, кроме случаев, когда setId
был изменен.Я думал о том, чтобы как-то реализовать child_added
вместо once
, но он будет вызывать getClassesForElements
и getClassesAttributes
каждый раз, когда добавляется ребенок.Я также думал о перемещении getClassesForElements
и getClassesAttributes
вне слушателя, но они являются зависимыми от set
, поэтому, если я соединю их с асинхронной функцией внутри ловушки, это будет тот же результат.Поэтому лучше всего было бы пропустить начальный запуск прослушивателя child_added
и поместить его в эффект, который проверяет, был ли изменен setId
, или просто взять одни и те же данные дважды.Есть идеи?