useReducer处理表单时状态不更新,控制台提示找不到默认reducer出口怎么办?
我在用useReducer管理表单状态时遇到问题,输入框的值应该跟着state变化,但输入时完全没反应。之前用useState没问题,换成useReducer后就卡住了。尝试过直接修改state对象属性,但控制台提示Error: Objects are not valid as a React state,只能用dispatch。
现在我的reducer写成这样:
const formReducer = (state, action) => {
switch(action.type) {
case 'UPDATE_FIELD':
return { ...state, [action.field]: action.value };
}
};
当输入内容时控制台又报错Reducer didn't return a state,是不是漏了默认情况?但加了default return state之后输入框又变成只读了,求指点!
useReducer处理表单时稍不注意就容易出问题,别走弯路,直接告诉你怎么解决。首先,你的reducer逻辑本身没错,但问题出在
switch的默认分支上。如果你只写了default: return state;,那么当action传入的内容不符合UPDATE_FIELD时,就会导致state没有正确更新。比如第一次初始化或者某些意外情况下的action类型错误。修正版的reducer应该是这样:
然后重点来了,你的dispatch调用可能有问题。确保你这么写:
最后说下为啥会变成“只读”。因为如果state里没有对应的字段,
value={formState.username}会变成undefined,而React里的value如果是undefined,它就会认为是个受控组件但没值,于是看起来就像只读一样。总结一下:
1. 确保reducer有默认返回。
2. 初始化state时最好给个空对象
{}。3. 绑定value时加个
|| ''防止undefined。按这个改完,应该就没问题了。记得调试时多打印下state和action,能帮你快速定位问题。