问题:使用 orderByChild 后如何处理我的列表?

我正在构建一个应用程序,用户可以在其中发布帖子然后对其进行投票。我希望能够从 firebase 请求帖子列表并按票数排序。我怎样才能做到这一点?

我的数据是这样的结构:

在此处输入图像描述

我正在尝试执行此操作:

export const fetchPostsByHottest = () => {
  return (dispatch) => {
    firebase.database().ref('/social/posts')
      .orderByChild('vote_count')
      .on('value', snapshot => {
        dispatch({ type: HOT_POSTS_FETCH_SUCCESS, payload: snapshot.val() });
      });
  };
};

它只是按正常顺序返回,通过按键。

有人告诉我,snapshot.val() 将快照转换为常规 JS 对象并终止任何订单。

这是我的减速机:

import {
  HOT_POSTS_FETCH_SUCCESS,
} from '../actions/FeedActions/types';

const INITIAL_STATE = {
};

export default (state = INITIAL_STATE, action) => {
  switch (action.type) {
    case HOT_POSTS_FETCH_SUCCESS:
      return action.payload;
    default:
      return state;
  }
};

然后我尝试将状态映射到我的feed组件中的道具:

const mapStateToProps = state => {
  const posts = _.map(state.hotFeed, (val, uid) => {
    return { ...val, uid };
  });

  return { posts: posts.reverse() };
};

我这样做是因为我需要从每个帖子对象中获取值和 UID。

如果我尝试在这样的操作中将其转换为数组:

export const fetchPostsByHottest = () => {
  return (dispatch) => {
    firebase.database().ref('/social/posts')
      .orderByChild('vote_count')
      .on('value', snapshot => {
        const nodes = [];
        snapshot.forEach(child => nodes.push(child.val()));

        console.log(nodes);
        dispatch({ type: HOT_POSTS_FETCH_SUCCESS, payload: nodes });
      });
  };
};

然后它只会让我回到其中一个帖子,它也不会给我 UID。

我该如何解决这个问题? :S

谢谢!

马特

解答

您最后一个片段中的查询应该是正确的。它没有理由只返回一个帖子。但是,快照的forEach可能被短路:

回调可以返回 true 以取消进一步的枚举。

push返回新的长度,并且forEach可能正在测试任何真实值 - 而不仅仅是true- 并且正在取消进一步的枚举。使用块来确保返回undefined

此外,您可以使用孩子的key属性获取密钥。

firebase.database().ref('/social/posts')
  .orderByChild('vote_count')
  .once('value', snapshot => {

    const nodes = [];
    snapshot.forEach(child => { nodes.push({ ...child.val(), key: child.key }); });

    console.log(nodes);
    dispatch({ type: HOT_POSTS_FETCH_SUCCESS, payload: nodes });
  });

此外,对于您的用例,once似乎比on更合适。

Logo

React社区为您提供最前沿的新闻资讯和知识内容

更多推荐