使用orderByChild后如何使用我的列表?

时间:2017-01-19 18:37:08

标签: reactjs firebase react-native firebase-realtime-database redux

我正在构建一个应用程序,用户可以在其中发帖,然后对其进行投票。我希望能够从firebase请求帖子列表,并通过投票计数来订购它们。我怎么能这样做?

我的数据是这样的结构:

enter image description here

我正试图解雇这个动作:

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

谢谢!

马特

1 个答案:

答案 0 :(得分:3)

您上一个代码段中的查询应该是正确的。它没有理由只返回一个帖子。但是,快照的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更合适。