React Native调用unshift报错todos.unshift is not a function是什么原因
报错原因
- 该问题和useState无关,不是useState没有识别数组类型,错误来源于
Array.unshift()的返回值特性和React状态更新规则的冲突 - JavaScript原生的
unshift()是会直接修改原数组的可变方法,执行后返回值是修改后数组的长度,属于数字类型,而非修改后的数组本身 - 首次执行
setTodos(todos.unshift(newTodo))时,数组类型的todos就被更新为数字类型,后续再次调用unshift时,数字类型变量没有对应的方法,就会触发该报错
修复方案
推荐使用符合React不可变更新规范的写法,直接构造新数组更新状态:
function addItem(newTodo) { console.log(newTodo); setTodos([newTodo, ...todos]); }
如果需要使用unshift方法实现逻辑,要先拷贝原数组再操作,避免直接修改原状态:
function addItem(newTodo) { console.log(newTodo); const newTodos = [...todos]; newTodos.unshift(newTodo); setTodos(newTodos); }
额外提示:React状态更新要求遵循不可变原则,不要直接修改原状态的值,否则可能出现视图不更新、逻辑异常等问题。
内容的提问来源于stack exchange,提问作者Nithin Deepkumar
相关产品推荐
相关产品推荐

