javascript - 错误:解构变量时已在开关内声明了 Javascript 标识符
问题描述
我有一个用于 redux reducer 的开关,但在解构作为有效负载的 javascript 对象时遇到了麻烦。
代码文件:
export default (state = initialState, action) => {
switch (action.type) {
case CHANGE_LOGIN_CREDENTIALS_FIELD:
let { text, field } = action.payload;
let newState = { ...state };
newState.inputs[field].content = text;
return newState;
case FOCUS_CREDENTIALS_FIELD:
let { field } = action.payload;
let newState = { ...state };
newState.inputs[field].focused = true;
return newState;
default:
return state;
}
};
无论如何要解决这个问题而不必使用不同的变量名?
解决方案
let
变量是块范围的,整个switch
主体是一个块。
您可以将解构分配行移至开头:
export default (state = initialState, action) => {
switch (action.type) {
let { text, field } = action.payload;
let newState = { ...state };
case CHANGE_LOGIN_CREDENTIALS_FIELD:
newState.inputs[field].content = text;
return newState;
case CHANGE_LOGIN_CREDENTIALS_FIELD:
newState.inputs[field].focused = true;
return newState;
default:
return state;
}
};
如果您对其中的每一个都有(大致)相同的逻辑,则此方法有效。而在这种情况下,你会这样做——你总是想要field
fromaction.payload
并且有时需要text
。因此,如果您两者都服用,您可以酌情使用其中一种或两种。另外,newState
is always{ ...state }
和作为一个let
变量,你也需要避免重新声明它。
另一种选择是将每个case
放入一个块中:
export default (state = initialState, action) => {
switch (action.type) {
case CHANGE_LOGIN_CREDENTIALS_FIELD: {
let { text, field } = action.payload;
let newState = { ...state };
newState.inputs[field].content = text;
return newState;
}
case FOCUS_CREDENTIALS_FIELD: {
let { field } = action.payload;
let newState = { ...state };
newState.inputs[field].focused = true;
return newState;
}
default:
return state;
}
};
这使每个块都case
成为一个独立的块,因此您可以避免let
它们之间的变量冲突。
推荐阅读
- azure - 如果未传递 userId,acquireTokenAsync 方法将引发错误
- html - R闪亮:文本不会在splitLayout()中换行
- sapui5 - 获取 XML 片段中定义的控件 ID
- r - 如何仅使用 R 获取链接
- google-sheets - 无法对谷歌表格中的查询结果运行过滤器
- excel - 使用命名范围表时出现 VLOOKUP 问题
- azure - 从多个设备向 Microsoft Azure IoT Central 发送数据的最佳方法
- mysql - 在 mySQL 中寻找此 IF 语句的解决方案
- bash - 将区间表达式与 bash 扩展通配符一起使用
- python - 熊猫从其他 2 列中删除列值