我有一个像这样的javascript状态对象:
expFormErrors: {
position: false,
company: false,
dateStart: false,
dateEnd: false
}
我有一个应该验证的输入字段。 我的验证功能如下。非常简单。
function validateText(text, fieldError, fieldInStringFormat) {
let minLength = 3;
let maxLength = 30;
let hasError = false;
if(text.length < minLength || text.length > maxLength) {
hasError = true;
} else hasError = false;
return {
type: VALIDATE_TEXT,
payload: { field: fieldInStringFormat, fieldError: hasError }
}
好的,所以它基本上调度了一个redux商店更新。在reducer中我有一个switch语句,它根据放入fieldInStringFormat
参数的内容更新状态。这样做对我来说,大量的代码来完成一些简单的事情......这里是它在减速器中的样子。
switch(action.fieldInStringFormat){
case 'position':
return {
...state,
expFormError: action.payload.fieldError,
expFormErrors: {
...state.expFormErrors,
position: action.payload.fieldError }
};
case 'company':
return {
...state,
expFormError: action.payload.fieldError,
expFormErrors: {
...state.expFormErrors,
company: action.payload.fieldError
}
};
}
正如您所看到的,这是一大堆重复的代码,我认为这是没有人想要的。 &#39;永远不要重复自己&#39;假设我有一个包含100个字段的对象,输入所有这些都是荒谬的。
有更好的方法吗?我尝试查找各种JSON引用,但无法找到任何内置的方法。
我想象的解决方案是这样的:
return {
...state,
expFormErrors: {
...state.expFormErrors,
[someParameterStringWhichWouldEqualTheWantedField]: action.payload.fieldError
答案 0 :(得分:3)
您想要的术语是computed property keys。他们将完全满足您的需求:
return {
...state,
expFormErrors: {
...state.expFormErrors,
[action.fieldInStringFormat]: action.payload.fieldError
}
};