【发布时间】:2018-02-26 20:39:19
【问题描述】:
我正在开发我的第一个 React Native 应用程序,这是我第一次使用 redux 和 redux saga。因此,我构建了一个 Flatlist 以使用 API 端点无限滚动并返回帖子(每页 10 个)。但是我不知道如何使用redux saga使用reducers返回帖子,控制加载指示器并跟踪商店中的页码。
我的代码如下:
Home.js
this.state = {
page: 1,
totalPages: 10,
loading: false,
}
componentDidMount() {
this.loadMorePosts();
}
loadMorePosts = () => {
this.setState(() => { loading: true });
this.setState(() => { page: this.state.page++ });
this.props.loadPosts(this.state.page);
}
<AnimatedFlatList
...
onEndReached={this.loadMorePosts}
onEndReachedThreshold={0.2}
/>
const mapStateToProps = state => ({
posts: state.posts,
});
帖子操作
export function loadPosts(page){
return {
type: Types.FETCH_POSTS,
payload: { page }
};
}
帖子传奇
export function* fetchPosts(action) {
const response = yield call(api.get, `/posts/${action.payload.page}`);
yield put({ type: Types.LOAD_POSTS, payload: { posts: response.data } });
}
帖子缩减器
export default function posts(state = initialState, action) {
switch(action.type) {
case Types.LOAD_POSTS:
return [ ...state, ...action.payload.posts ];
default:
return state;
}
}
有了这个,我可以获取帖子并加载到 Flatlist 中,但是如果我改变屏幕,我会忘记实际的页码,在 Home.js 构造函数中将再次设置为 0。并且没有视觉反馈,因为加载状态不是用 mapStateToProps 函数定义的......
谁能帮我解决这个问题?
【问题讨论】:
-
我建议在 redux reducer 状态下也有页码和加载指示器。
-
您的意思是创建新的独立reducer,在saga 获取帖子后监听相同的事件?
-
添加了答案
标签: javascript react-native redux redux-saga react-native-flatlist