我想知道,如何更新状态中的特定值。我有状态配置,我想更新“偏移”值而不修改限制或总值,只需使用this.props.setParams()...设置新偏移即可。
使用此功能,我想修改offset this.props.setParams({offset:10}),或限制this.props.setParams({limit:40}),依此类推...只需发送一个参数并直接修改关联状态。
searchList.js
this.props.setParams({ offset: 10})
actions-search.js
export function setFilters(newFilters) {
return {
type : SEARCH.SET_NEW_FILTERS,
payload: newFilters
};
}
export function setParams(newParams) {
return {
type : SEARCH.SET_NEW_PARAMS,
payload: newParams
};
}
reducer-search.js
...
/*State : CONFIG*/
/*config: {
filters : {
...
}
params: {
offset: 0,
limit: 25,
total: 100
}
}*/
case SEARCH.SET_NEW_FILTERS :
let newFilters = action.payload;
return {
...state,
config: {
...state.config,
filters : {
...state.config.filters,
newFilters
}
params : {
...state.config.params
}
}
};
case SEARCH.SET_NEW_PARAMS :
let newParams = action.payload; // {offset: 10}
return {
...state,
config: {
...state.config,
filters : {
...state.config.filters
}
params : {
...state.config.params,
newParams
}
}
};
....
目前,我必须写这个:
return {
...state,
config: {
...state.config,
params : {
...state.config.params,
offset : newParams.offset
}
}
};
如何在我的减速器中使用更多“通用”产品?没有指定特定的属性,而是更全局的。
只需在我的动作创建者中发送一个对象“ params”,例如:this.props.setParams({offset:30,total:120})?
答案 0 :(得分:2)
实际行为
您的代码正在添加newFilters
和newParams
作为属性。这样,您将必须以以下方式访问offset
:
state.config.params.newParams.offset
解决方案
要直接使用这些新的过滤器或参数
state.config.params.offset
您应该使用spread syntax newFilters
在减速器中传播newParams
和...
:
filters : {
...state.config.filters,
...newFilters
}
和
params : {
...state.config.params,
...newParams
}
spread语法将分别将有效负载newFilters
和newParams
的内部属性添加(或替换)到state.config.filters
和state.config.params
的属性中。
改进
要简化减速器,您可以直接传播action.payload
并删除一些可能不必要的传播:
actions-search.js
...
case SEARCH.SET_NEW_FILTERS :
return {
...state,
config: {
...state.config,
filters : {
...state.config.filters,
...action.payload
}
}
};
case SEARCH.SET_NEW_PARAMS :
return {
...state,
config: {
...state.config,
params : {
...state.config.params,
...action.payload
}
}
};
...