reactjs - 调用多次调度后无法获取更新状态
问题描述
我正在使用带有 React 的 redux 来管理状态,但是当我从一个动作创建者调用两个调度函数时,它是第一次调度的返回状态,但在另一个调度调用之后无法获取更新的状态。
我尝试从不同的减速器调用调度并尝试在 API 调用后调用。
这是我的行动。
export const setLoader = (loader) => dispatch => {
dispatch({ type: SET_LOADER, payload: loader });
};
export const fetchCategory = (setLoader) => async dispatch => {
setLoader(true);
try {
const instance = axios.create();
instance.defaults.headers.common['Authorization'] = AUTHORIZATION_TOKEN;
const response = await instance.get(API_PATHS.SERVICE_CATEGORY_API);
dispatch({ type: FETCH_CATEGORY, payload: response.data });
} catch (e) {
setLoader(false);
}
};
这里我定义了减速器:
export default (state = INITIAL_STATE, action) => {
switch (action.type) {
case FETCH_CATEGORY:
return { ...state, categoryList: action.payload };
case SET_LOADER:
return { ...state, isLoading: action.payload };
default:
return state;
}
};
这里我的组件与 redux 连接:
const mapStateToProps = state => {
return ({
categoryList: state.locator.categoryList
});
}
export default connect(
mapStateToProps,
{ fetchCategory, setLoader }
)(ServiceLocator);
我希望输出返回更新后的 categoryList,但实际上它返回一个空白数组。
解决方案
你正在你的 action creator 中执行一个异步任务,如果没有中间件,Redux 无法处理。我推荐使用中间件redux-thunk。这将允许您在动作创建者中执行异步动作并多次分派。
希望这可以帮助!
更新:
如果您已redux-think
安装中间件并将其添加到 Redux(根据您的评论),那么接下来我会看看setLoader()
- 看起来该函数已被 curried,我认为您不希望它成为。我将删除该setLoader()
步骤并直接从以下位置分派该操作fetchCategory()
:
export const fetchCategory = () => async dispatch => {
dispatch({ type: SET_LOADER, payload: true });
try {
const instance = axios.create();
instance.defaults.headers.common['Authorization'] = AUTHORIZATION_TOKEN;
const response = await instance.get(API_PATHS.SERVICE_CATEGORY_API);
dispatch({ type: FETCH_CATEGORY, payload: response.data });
} catch (e) {
dispatch({ type: SET_LOADER, payload: false });
}
};
推荐阅读
- mysql - 还原 CTE(通用表表达式)
- core-data - 在 iOS 中工作 NSPersistentCloudKitContainer 时获取错误堆栈跟踪
- openssl - -26![] 和 .Q.hg 仍然失败,即使所有东西都安装到位
- angular - Angular 8 @ViewChild 翻译
- javascript - 为什么 readdirSync 会自动对结果进行排序?
- ruby - 尝试访问 Ruby 哈希时出现 NoMethodError,但在 irb 中有效
- php - 输入此代码后链接不断重复
- qt - 如何使 GridLayout 的 QML 子项具有自动宽度和高度
- python - 无法在 Ubuntu 14.04 上安装 pip
- mysql - 从同一列中选择多个相同的值行