You need to enable JavaScript to run this app. React使用useState更新待办数组需点击两次按钮问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

React使用useState更新待办数组需点击两次按钮问题咨询

问题原因分析
  • React状态更新为异步批量执行:调用setTodoList、setInputTodo后,不会立即修改当前作用域下的状态变量,当前handleSubmit函数执行时拿到的始终是本次渲染周期的旧状态值,所以调用setTodoList后立刻打印todoList拿到的还是更新前的空数组,要等到组件重新渲染后,状态才会更新为新值。
  • todoList数组更新逻辑错误:todoList是存储多条待办的数组,你当前直接调用setTodoList(inputTodo)会把数组类型直接覆盖为输入值的类型,而非将新待办追加到原有数组中。正确写法应该是基于之前的状态更新:setTodoList(prevList => [...prevList, inputTodo])
  • input状态赋值逻辑错误:输入框的onChange回调中你写的是setInputTodo([e.target.value]),会把原本为字符串类型的inputTodo覆盖为单元素数组,和初始类型不匹配。应该改为setInputTodo(e.target.value)。
  • 语法错误:handleSubmit中打印Todo List Array的console.log语句缺少右括号),会直接导致运行报错。
修复后参考代码
import { useState, useEffect } from 'react'

const [inputTodo, setInputTodo] = useState("")
const [todoList, setTodoList] = useState([])

function handleSubmit(){
    if (!inputTodo.trim()) return // 可加空值校验避免提交空待办
    console.log(`input Todo: ${inputTodo}`)
    // 基于旧数组追加新待办
    setTodoList(prev => [...prev, inputTodo])
    setInputTodo("")
}

// 新增useEffect监听todoList变化,打印更新后的数组
useEffect(() => {
    console.log(`Todo List Array:`, todoList)
}, [todoList])

return(
    <div className="addTodo__container">
        <div className="add-Todo__inputWrapper">
          <input
            className="add-Todo__input"
            name="todo"
            type="text"
            placeholder="ADD TODO"
            value={inputTodo}
            // 修复input赋值逻辑
            onChange={(e) => setInputTodo(e.target.value)}
            />
        </div>
        <div className="add-Todo__taskButtonContainer">  
         <button className="add-Todo__taskBtn" onClick={handleSubmit}>New Task</button>
        </div>
    </div>
)

内容的提问来源于stack exchange,提问作者meeshaa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 09:06:03