【发布时间】:2020-07-13 14:12:41
【问题描述】:
我正在使用 react 钩子测试简单的分页,并想知道如何处理失败以使其保持有效状态?
伪代码:
function reducer(state, action) {
switch (action.type) {
case 'next':
return {page: state.page + 1};
case 'prev':
return {page: state.page - 1};
default:
throw new Error();
}
}
function Page() {
const [state, dispatch] = useReducer(reducer, { page: 1});
useEffect(() => {
loadMore(state.page)
.then(r => console.log(r))
.catch(e => {
// how to revert page without triggering this effect?
// cause if I do dispatch({type: 'prev'}) page will change, and this will re-run
console.log(e)
})
}, state.page)
return (
<>
Page: {state.page}
<button onClick={() => dispatch({type: 'prev'})}>-</button>
<button onClick={() => dispatch({type: 'next'})}>+</button>
</>
);
}
让我们来看看这个场景:
- 我们从第 1 页开始
- 用户点击下一步
- 页面增加状态
- useEffect 触发,网络请求失败。
- 状态页面为2,但实际数据为页面1
我无法在 catch 时调度页面更改事件,因为它会触发重新获取,我不想这样做
我正在考虑的另一个选项是,我应该只在获得数据后才增加页面,但是我会在 useEffect 中创建无限循环,因为页面会在获取数据后发生变化?
【问题讨论】:
标签: reactjs react-hooks