Удалить вложенный дочерний элемент из состояния притока после срабатывания прослушивателя Firebase 'child_removed' - PullRequest
0 голосов
/ 13 февраля 2019

Мое состояние избыточности выглядит следующим образом (оно синхронизируется с Firebase).

{
  profile: {
    activeUsers: {
      Iiva2BGZffNTH84glOLXv8QHVTF2: {
        sex: male,
        age: 20,
      },
      PkfMxrN09RN7ygoBMWqm4jheEOx1: {
        sex: female,
        age: 20,
      },
      zQiGXvcUGmRSKUdr719621QleUw2: {
        sex: male,
        age: 25,
      }
    }
  }
}

Я хочу удалить пользователя zQiGXvcUGmRSKUdr719621QleUw2

Вот мой создатель действий

  Firebase.database()
    .ref('profiles/activeUsers')
    .on(
      'child_removed',
      (snapshot) => {
        dispatch(_activeUserChildRemoved(snapshot));
      },
      (err) => {
        console.log(err.toString());
        Alert.alert(err);
      },
    );
};

const _activeUserChildRemoved = snapshot => ({
  type: ACTIVE_USER_CHILD_REMOVED,
  payload: snapshot,
});

и, наконец, вот мой редуктор

  switch (action.type) {
    case ACTIVE_USER_CHILD_REMOVED:
      const key4Del = action.payload.key;
      return { //what goes here??? };
    default:
      return state;
  }
};

Что я возвращаю из редуктора, чтобы удалить пользователя, на который ссылается snapshot.key, из редукса?Помощь очень ценится

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Вам нужно удалить пользователя, не изменяя состояние и просто используя разрушение .

Прямо сейчас вы изменяете state напрямуюудаление свойства объекта из oldState

case ACTIVE_USER_CHILD_REMOVED:
  const key4Del = action.payload.key;
  const { [key4Del]: _, ...activeUsers} = state.activeUsers
  return {...state, activeUsers }

Синтаксис распространения будет поверхностно сравнивать объект, поэтому вам необходимо снова объединить отфильтрованный объект, чтобы сгенерировать новое состояние.

0 голосов
/ 21 февраля 2019

Понял !!

case ACTIVE_USER_CHILD_REMOVED:
      const key4Del = action.payload.key;
      const oldState = state;
      delete oldState.activeUsers[key4Del];
      return { ...oldState };
...