Reactjs 重用Redux react异步请求操作创建者/还原器
因此,我有一个简单的异步请求操作创建者,用于请求和分派操作。我想对不同的请求重复使用相同的操作创建者,这样每个请求都有自己的状态。我将尝试展示一些代码,然后进行更多解释。这是我的动作创造者Reactjs 重用Redux react异步请求操作创建者/还原器,reactjs,redux,react-redux,redux-thunk,Reactjs,Redux,React Redux,Redux Thunk,因此,我有一个简单的异步请求操作创建者,用于请求和分派操作。我想对不同的请求重复使用相同的操作创建者,这样每个请求都有自己的状态。我将尝试展示一些代码,然后进行更多解释。这是我的动作创造者 function responseOK(response){ return { type: RESPONSE_OK, payload: response, } } function loadingChangedStatus(isLoading) { return { ty
function responseOK(response){
return {
type: RESPONSE_OK,
payload: response,
}
}
function loadingChangedStatus(isLoading) {
return {
type: IS_LOADING,
isLoading: isLoading,
}
}
function handleError(errorID){
return {
type: HANDLE_ERROR,
errorID: errorID,
}
}
export function makeRequest( URL){
return function(dispatch, getSate){
dispatch( loadingChangedStatus(true) );
axios.get( URL )
.then(function(response){
dispatch(loadingChangedStatus(false));
dispatch(responseOK(response));
})
.catch(function (response) {
dispatch(loadingChangedStatus(false));
dispatch(handleError('connection_error'));
});
}
}
我的减速机减速机请求:
export default function(state = {isLoading:false, payload:false,errorID:false}, action){
switch (action.type) {
case IS_LOADING:
return Object.assign({}, state, {
isLoading: action.isLoading,
});
break;
case RESPONSE_OK:
return Object.assign({}, state, {
isLoading: state.isLoading,
payload: action.payload,
});
break;
case HANDLE_ERROR:
return Object.assign({}, state, {
isLoading: state.isLoading,
payload: action.payload,
errorID:action.errorID,
});
break;
default:
return state;
}
}
我的问题从这里开始
我组合减速器如下:
import { combineReducers } from 'redux';
import Request from "./reducerRequest";
const rootReducer = combineReducers({
// I WANT EACH OF THESE TO BE SEPARATE INSTANCE BUT USE THE SAME ACTION CREATOR / REDUCER
defaults: Request,
updates: Request,
});
export default rootReducer;
在我的组件中:
function mapStateToProps( {defaults, updates} ){
return {defaults, updates}
}
function mapDispatchToProps( dispatch ){
return bindActionCreators({ makeRequest}, dispatch);
}
问题:我想对不同的请求重新使用我的操作创建者。我怎么能
makeRequest('www.defaults.com')
,它将以defaults
makeRequest('www.updates.com')
,它将以updates
如何重用action creator和reducer在我的组件中创建两个单独的
默认值
和更新
实例?您可以为每个操作添加reducer操作的前缀:
export default function(namespace)
return function(state = {isLoading:false, payload:false,errorID:false}, action){
switch (action.type) {
case namespace + IS_LOADING:
return Object.assign({}, state, {
isLoading: action.isLoading,
});
break;
case namespace + RESPONSE_OK:
return Object.assign({}, state, {
isLoading: state.isLoading,
payload: action.payload,
});
break;
case namespace + HANDLE_ERROR:
return Object.assign({}, state, {
isLoading: state.isLoading,
payload: action.payload,
errorID:action.errorID,
});
break;
default:
return state;
}
}
}
然后添加名称空间
function responseOK(namespace, response){
return {
type: namespace + RESPONSE_OK,
payload: response,
}
}
const rootReducer = combineReducers({
// I WANT EACH OF THESE TO BE SEPARATE INSTANCE BUT USE THE SAME ACTION CREATOR / REDUCER
defaults: Request("DEFAULTS_"),
updates: Request("UPDATES_"),
});
然后在调用makerequests时使用名称空间
call makeRequest('DEFAULTS_', 'www.defaults.com') and it ends up in defaults
call makeRequest('UPDATES_', 'www.updates.com') and it ends up in updates
HTH很酷,谢谢。它似乎在工作。我还是个新手。如果可能的话,你能告诉我吗。这是针对最佳实践的考虑,还是只是为了填补Redux/React中的一些空白而进行的某种黑客或变通方法?这是相当标准的。默认的
combineReducer
实用程序使所有子reducer函数都有机会响应给定的操作,因此如果在reducer结构中使用同一个reducer两次,它们需要某种方法来区分是否响应。另外,在我的Redux插件目录中,也列出了许多类似的action/reducer包装实用程序。我想已经有几个可以为你做很多这方面的工作了。