You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中点击按钮将输入框值存入数组的问题排查与修复

React useState数组更新问题:点击按钮后数组清空的原因及修复

问题原因

  • 表单默认提交行为导致页面刷新:按钮位于<form>标签内,默认类型为submit,点击后会触发表单提交流程,页面刷新后组件重新初始化,数组回到初始空状态,表现为“被清空”。
  • 数组状态更新写法错误:当前setItem(...item, name.firstName)将数组元素拆分为多个参数传递给setItem,但setItem需要接收完整的新数组对象,这种写法会导致状态更新逻辑异常。

修复方法

1. 阻止表单默认提交行为

给按钮添加type="button"属性,避免触发表单提交:

<button type="button" onClick={handlePushNameToArray}>Push to array</button>

或者在点击事件中手动阻止默认行为:

const handlePushNameToArray = (e) => {
  e.preventDefault();
  setItem([...item, name.firstName]);
};

2. 修正数组状态更新逻辑

使用扩展运算符创建新数组,遵循React状态不可变更新原则:

setItem([...item, name.firstName]);

该写法基于原数组生成新数组,并追加新元素,确保状态更新符合React的机制。

完整修复代码

import React, { useState } from "react";

const HookCounter5 = () => {
  const [item, setItem] = useState([]);
  const [name, setName] = useState({ firstName: "" });
  
  const handlePushNameToArray = () => {
    setItem([...item, name.firstName]);
  };
  
  return (
    <div>
      <form>
        <input
          type="text"
          value={name.firstName}
          onChange={(e) => setName({ ...name, firstName: e.target.value })}
        />
        <button type="button" onClick={handlePushNameToArray}>Push to array</button>
        <div>{JSON.stringify(item)}</div>
      </form>
    </div>
  );
};

export default HookCounter5;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 21:07:33