React使用useReducer后OnBlur触发时报action.val未定义错误如何解决
错误根因
- 密码 reducer 的条件判断逻辑存在语法错误:你在
passReducer中用了赋值运算符=代替了全等比较运算符===。
代码里的if ((action.type = "PASS_INPUT"))实际是直接给action.type强制赋值为"PASS_INPUT",赋值表达式返回值恒为真,所以无论你触发的是输入事件还是失焦事件,都会进入这个分支。
失焦触发的PASS_BLUR动作没有携带val参数,进入该分支后访问action.val.trim自然会抛出 undefined 报错。 - 邮箱逻辑没有问题是因为
emailReducer里的条件判断用的是正确的===严格比较,只有对应类型的动作才会进入对应分支,失焦动作不会触发需要val参数的输入逻辑。
修复方案
将 passReducer 的条件判断运算符修正为 ===,同时补全失焦时的校验逻辑即可:
const passReducer = (state, action) => { // 替换=为=== if (action.type === "PASS_INPUT") { return { ...state, value: action.val, isValid: action.val.trim().length > 6, }; } // 替换=为===,同时补全失焦校验逻辑,和邮箱逻辑对齐 if (action.type === "PASS_BLUR") { return { ...state, isValid: state.value.trim().length > 6 }; } return { value: "", isValid: false }; };
其他可选优化
你定义的密码派发器名称有拼写错误:passDispach 应为 passDispatch,不影响运行但容易后续开发写错。
内容的提问来源于stack exchange,提问作者Adrian Gorgos
相关产品推荐
相关产品推荐

