使用 orderByChild 后如何处理我的列表?
·
问题:使用 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更合适。
更多推荐
所有评论(0)