我正在构建一个应用程序,用户可以在其中发帖,然后对其进行投票。我希望能够从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
谢谢!
马特
答案 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
更合适。