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侦听器是否足够快以用redux替换数据预调度?

如果我们要构建一个应用程序,并希望在那里实时刷新来自外部的数据,则侦听器可以提供帮助。但是,如果我们预先调度获得的数据,则调度了两次。此外,如果我们仅使用侦听器并从那里进行调度,则可以使代码及其工作更加整洁。但是,如果数据库中有大量数据怎么办?听众会快吗?仅通过侦听器来处理调度是否有效,还是值得在现场进行预调度?

最佳答案

我建议您让Firebase事件监听器调用redux-thunk操作,然后操作并将数据分发到您的应用程序。如果做得正确,那没有什么错。

但是,请考虑一些更好但不同的方法。

react-redux-firebase允许与应用程序商店紧密耦合。但是,如果这太多了(您实际上是在将应用程序与Firebase融合在一起),那么请选择前者。

无论如何,我建议您多搜索一些有关在redux应用程序中使用Firebase的内容。

10-08 08:51
查看更多