如何在 Redux 中创建 Dynamic Reducer
How to create a Dynamic Reducer in Redux
我在 Redux Store 的状态下有这个 object
:
altaUsuario: {
//identificacion
identificacion : {
email: '',
username: '',
},
//Localización
localizacion : {
direccion: '',
cp: '',
provincia: '',
},
//Redes sociales
rdSocial : [
{
red:"",
name:""
},
],
假设我的表单有三个步骤,每个步骤都会更新一个特定的部分,所以我调用一个更新操作 识别 其他更新操作 localizacion 和更新的最后一个 rdSocial,(对西班牙变量感到抱歉)。
这里重要的部分是每个动作的有效负载,它是整个 altaUsuario
对象的一部分,例如,这是我的一个动作:
{
type: 'ADD_ID_FIELDS',
payload: {
email: '',
username: 'josue',
}
}
现在,我的减速器从状态对象复制并更新 altaUsuario 属性,更新我想要的对象的特定部分更新。 (听起来很混乱)让我们看看我是怎么做的:
case ADD_ID_FIELDS:
return { ...state, altaUsuario : {...state.altaUsuario, identificacion :action.payload }}
case ADD_LOCAL_FIELDS:
return { ...state, altaUsuario : {...state.altaUsuario, localizacion :action.payload }}
case ADD_RD_SOCIAL:
return { ...state, altaUsuario : { ...state.altaUsuario, rdSocial : action.payload}}
default:
So, How could I automate this process in one single action?
这是我目前所拥有的,但它不起作用:
case ADD_FIELD:
Object.keys(state.altaUsuario).map (cat => {
if(Object.keys(action.payload).some(r=> Object.keys(state.altaUsuario[cat]).includes(r))){
return { ...state, altaUsuario : {...state.altaUsuario, [cat] :action.payload }}
}
})
我的想法是在 altaUsuario 中使用我想要更新的特定 属性 进行搜索,但它不起作用。
这是个好方法吗?
在current reducer中,action ID (ADD_ID_FIELDS, ADD_LOCAL_FIELDS, ADD_RD_SOCIAL)决定了要更新哪个字段(identificacion, localizacion, rdSocial)。
所以为了让你接近工作,你需要在执行动作时传入要更新的参数。例如。作为行动的一部分。像这样:
case "ADD_FIELD":
return { ...state, altaUsuario: {...state.altaUsuario, [action.fieldToUpdate]: action.payload }};
操作调用看起来像:
export const addField = (payload, id) => dispatch =>
dispatch({ type: ADD_FIELD, fieldToUpdate: id, payload })
我在 Redux Store 的状态下有这个 object
:
altaUsuario: {
//identificacion
identificacion : {
email: '',
username: '',
},
//Localización
localizacion : {
direccion: '',
cp: '',
provincia: '',
},
//Redes sociales
rdSocial : [
{
red:"",
name:""
},
],
假设我的表单有三个步骤,每个步骤都会更新一个特定的部分,所以我调用一个更新操作 识别 其他更新操作 localizacion 和更新的最后一个 rdSocial,(对西班牙变量感到抱歉)。
这里重要的部分是每个动作的有效负载,它是整个 altaUsuario
对象的一部分,例如,这是我的一个动作:
{
type: 'ADD_ID_FIELDS',
payload: {
email: '',
username: 'josue',
}
}
现在,我的减速器从状态对象复制并更新 altaUsuario 属性,更新我想要的对象的特定部分更新。 (听起来很混乱)让我们看看我是怎么做的:
case ADD_ID_FIELDS:
return { ...state, altaUsuario : {...state.altaUsuario, identificacion :action.payload }}
case ADD_LOCAL_FIELDS:
return { ...state, altaUsuario : {...state.altaUsuario, localizacion :action.payload }}
case ADD_RD_SOCIAL:
return { ...state, altaUsuario : { ...state.altaUsuario, rdSocial : action.payload}}
default:
So, How could I automate this process in one single action?
这是我目前所拥有的,但它不起作用:
case ADD_FIELD:
Object.keys(state.altaUsuario).map (cat => {
if(Object.keys(action.payload).some(r=> Object.keys(state.altaUsuario[cat]).includes(r))){
return { ...state, altaUsuario : {...state.altaUsuario, [cat] :action.payload }}
}
})
我的想法是在 altaUsuario 中使用我想要更新的特定 属性 进行搜索,但它不起作用。
这是个好方法吗?
在current reducer中,action ID (ADD_ID_FIELDS, ADD_LOCAL_FIELDS, ADD_RD_SOCIAL)决定了要更新哪个字段(identificacion, localizacion, rdSocial)。
所以为了让你接近工作,你需要在执行动作时传入要更新的参数。例如。作为行动的一部分。像这样:
case "ADD_FIELD":
return { ...state, altaUsuario: {...state.altaUsuario, [action.fieldToUpdate]: action.payload }};
操作调用看起来像:
export const addField = (payload, id) => dispatch =>
dispatch({ type: ADD_FIELD, fieldToUpdate: id, payload })