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

React项目如何用useEffect实现红绿切换按钮及点击计数,能否不用布尔值实现切换

React useEffect 切换状态&计数实现方案

基础实现(符合useEffect使用要求)

首先修正原代码的类型错误、逻辑割裂问题,通过useEffect监听状态变化实现计数:

import { useState, useEffect } from 'react';

function App() {
  const [currentStatus, setCurrentStatus] = useState('Green');
  const [counter, setCounter] = useState(0);

  // 切换状态逻辑
  const toggleStatus = () => {
    setCurrentStatus(prevStatus => prevStatus === 'Green' ? 'Red' : 'Green');
  };

  // 监听状态变化,每次切换触发计数+1
  useEffect(() => {
    setCounter(prevCount => prevCount + 1);
  }, [currentStatus]);

  return (
    <div>
      <h1 style={{ color: currentStatus.toLowerCase() }}>{currentStatus}</h1>
      <button onClick={toggleStatus}>Toggle status</button>
      <h3>总点击次数:{counter}</h3>
    </div>
  );
};

注:这里使用函数式更新状态,是为了避免闭包导致的状态更新异常,符合React官方推荐写法

非布尔值实现切换的方案

完全可以不使用布尔值实现切换,以下两种是常用方案:

  • 索引循环切换方案:适合后续需要扩展更多状态的场景,只需修改状态列表即可,不需要改动切换逻辑
const STATUS_OPTIONS = ['Green', 'Red'];
const [statusIndex, setStatusIndex] = useState(0);
const [counter, setCounter] = useState(0);

const toggleStatus = () => {
  // 取模运算实现循环切换,支持任意数量的状态
  setStatusIndex(prev => (prev + 1) % STATUS_OPTIONS.length);
};

useEffect(() => {
  setCounter(prev => prev + 1);
}, [statusIndex]);

// 渲染时取值:STATUS_OPTIONS[statusIndex]
  • 字符串状态直接切换:就是上面基础实现用的方案,直接用状态本身的字符串值做判断,不需要中间布尔值转换,逻辑更直观易懂。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 01:06:05