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

React使用useState点击切换标题与按钮文本出现重复异常如何解决

问题根源

arr数组被定义在组件函数内部,每次组件触发重渲染时,这个数组都会被重新初始化为["Marco", "Polo"],完全不会保留上一次点击交换后的结果。
对照控制台输出就能对应上异常逻辑:

  • 第一次点击:初始数组交换为['Polo', 'Marco'],更新state触发重渲染,arr被重置回初始值
  • 第二次点击:刚被重置的数组又被交换为['Polo', 'Marco'],和第一次点击的更新结果完全一致,页面显示重复
  • 后续点击会重复上述重置-交换的流程,自然无法保持正常交替逻辑

另外原代码中setInputBUtton存在拼写错误(Button首字母未大写),虽然不影响运行,但不符合常规命名规范。

修复方案

二选一即可:

方案1:直接交换state值(最简洁)

不需要额外定义中间数组,每次点击直接互换两个state的值:

import React, { useState } from "react";
import "../styles/App.css";
const App = () => {
  const [input, setInput] = useState("Marco");
  const [inputButton, setInputButton] = useState("Polo");
  const changethis = () => {
    setInput(inputButton);
    setInputButton(input);
  };

  return (
    <div id="main">
      <h1 id="marco-polo">{input}</h1>
      <button id="marco-polo-toggler" onClick={changethis}>
        {inputButton}
      </button>
    </div>
  );
};

export default App;

方案2:将数组纳入state管理

如果要保留数组的实现逻辑,就把数组放到state中管理,避免重渲染时被重置:

import React, { useState } from "react";
import "../styles/App.css";
const App = () => {
  const [arr, setArr] = useState(["Marco", "Polo"]);
  const changethis = () => {
    setArr([arr[1], arr[0]]);
  };

  return (
    <div id="main">
      <h1 id="marco-polo">{arr[0]}</h1>
      <button id="marco-polo-toggler" onClick={changethis}>
        {arr[1]}
      </button>
    </div>
  );
};

export default App;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 22:57:20