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

React中点击按钮切换倒计时组件时隐藏其余组件的实现方法

问题根源

你当前使用3个独立的布尔型useState分别控制三个倒计时组件的显隐,每个按钮的点击逻辑仅翻转自身对应state的布尔值,不会修改另外两个state的状态,根本无法实现互斥效果——只要连续点击两个不同的主题按钮,对应两个state都会变为true,两个倒计时组件就会同时显示在页面上。

实现方法

删除3个独立的布尔state,改用单个state存储当前激活的倒计时类型,默认值设为新年倒计时的对应标识,点击按钮时直接将state更新为当前按钮对应的类型即可,渲染时仅匹配当前激活类型对应的组件。
修改后的App.js代码:

import './App.css';
import React from "react";
import NewYear from './Components/NewYear';
import Chinese from './Components/Chinese';
import Birthday from './Components/Birthday';
import { useState } from 'react';

// 统一定义倒计时类型常量,避免硬编码写错
const COUNT_DOWN_TYPE = {
  NEW_YEAR: 'newYear',
  CHINESE_NEW_YEAR: 'chineseNewYear',
  BIRTHDAY: 'birthday'
}

function App() {
  // 单个state控制当前展示的倒计时,默认展示新年倒计时
  const [activeCountDown, setActiveCountDown] = useState(COUNT_DOWN_TYPE.NEW_YEAR);

  return (
    <div className="App">
      {activeCountDown === COUNT_DOWN_TYPE.NEW_YEAR && <NewYear />}  
      {activeCountDown === COUNT_DOWN_TYPE.CHINESE_NEW_YEAR && <Chinese />}  
      {activeCountDown === COUNT_DOWN_TYPE.BIRTHDAY && <Birthday />}  
      <button 
        onClick={() => setActiveCountDown(COUNT_DOWN_TYPE.NEW_YEAR)} 
        className='nieuw'
      >
        New Year
      </button>
      <button 
        onClick={() => setActiveCountDown(COUNT_DOWN_TYPE.CHINESE_NEW_YEAR)} 
        className='chinees'
      >
        Chinese New Year
      </button>
      <button 
        onClick={() => setActiveCountDown(COUNT_DOWN_TYPE.BIRTHDAY)} 
        className='verjaardag'
      >
        My Birthday
      </button>
    </div>
  );
}

export default App;
附加优化点

你贴出的NewYear组件中,useEffect没有传入依赖数组,会导致组件每次重渲染都重新创建、销毁定时器,存在不必要的性能开销,建议将setTimeout替换为setInterval并传入空依赖数组,组件挂载时仅创建一次定时器,卸载时自动清理即可:

useEffect(() => {
  const timer = setInterval(() => {
    setTimeLeft(calculateTimeLeft());
  }, 1000);
  return () => clearInterval(timer);
}, []);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 01:36:19