当前位置:首页 > React

react实现红绿灯

2026-01-27 10:55:58React

React 实现红绿灯

使用 React 实现一个红绿灯组件,可以通过状态管理和定时器控制灯的切换。以下是实现方法:

使用 useState 和 useEffect 管理状态

import React, { useState, useEffect } from 'react';

const TrafficLight = () => {
  const [activeLight, setActiveLight] = useState('red');

  useEffect(() => {
    const timer = setInterval(() => {
      setActiveLight(prevLight => {
        if (prevLight === 'red') return 'green';
        if (prevLight === 'green') return 'yellow';
        return 'red';
      });
    }, 2000);

    return () => clearInterval(timer);
  }, []);

  return (
    <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>
      <div
        style={{
          width: 100,
          height: 100,
          borderRadius: '50%',
          backgroundColor: activeLight === 'red' ? 'red' : 'gray',
          margin: 10
        }}
      />
      <div
        style={{
          width: 100,
          height: 100,
          borderRadius: '50%',
          backgroundColor: activeLight === 'yellow' ? 'yellow' : 'gray',
          margin: 10
        }}
      />
      <div
        style={{
          width: 100,
          height: 100,
          borderRadius: '50%',
          backgroundColor: activeLight === 'green' ? 'green' : 'gray',
          margin: 10
        }}
      />
    </div>
  );
};

export default TrafficLight;

使用 CSS 动画优化视觉效果

可以通过 CSS 动画让灯的变化更平滑:

react实现红绿灯

import React, { useState, useEffect } from 'react';
import './TrafficLight.css';

const TrafficLight = () => {
  const [activeLight, setActiveLight] = useState('red');

  useEffect(() => {
    const timer = setInterval(() => {
      setActiveLight(prevLight => {
        if (prevLight === 'red') return 'green';
        if (prevLight === 'green') return 'yellow';
        return 'red';
      });
    }, 2000);

    return () => clearInterval(timer);
  }, []);

  return (
    <div className="traffic-light">
      <div className={`light red ${activeLight === 'red' ? 'active' : ''}`} />
      <div className={`light yellow ${activeLight === 'yellow' ? 'active' : ''}`} />
      <div className={`light green ${activeLight === 'green' ? 'active' : ''}`} />
    </div>
  );
};

export default TrafficLight;

对应的 CSS 文件:

react实现红绿灯

.traffic-light {
  display: flex;
  flex-direction: column;
  align-items: center;
  background-color: black;
  padding: 20px;
  border-radius: 10px;
}

.light {
  width: 100px;
  height: 100px;
  border-radius: 50%;
  margin: 10px;
  opacity: 0.3;
  transition: opacity 0.5s ease-in-out;
}

.light.active {
  opacity: 1;
}

.red {
  background-color: red;
}

.yellow {
  background-color: yellow;
}

.green {
  background-color: green;
}

使用自定义 Hook 封装逻辑

将红绿灯的逻辑封装成自定义 Hook,提高代码复用性:

import React from 'react';
import useTrafficLight from './useTrafficLight';

const TrafficLight = () => {
  const activeLight = useTrafficLight();

  return (
    <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>
      <div
        style={{
          width: 100,
          height: 100,
          borderRadius: '50%',
          backgroundColor: activeLight === 'red' ? 'red' : 'gray',
          margin: 10
        }}
      />
      <div
        style={{
          width: 100,
          height: 100,
          borderRadius: '50%',
          backgroundColor: activeLight === 'yellow' ? 'yellow' : 'gray',
          margin: 10
        }}
      />
      <div
        style={{
          width: 100,
          height: 100,
          borderRadius: '50%',
          backgroundColor: activeLight === 'green' ? 'green' : 'gray',
          margin: 10
        }}
      />
    </div>
  );
};

export default TrafficLight;

自定义 Hook 文件:

import { useState, useEffect } from 'react';

const useTrafficLight = () => {
  const [activeLight, setActiveLight] = useState('red');

  useEffect(() => {
    const timer = setInterval(() => {
      setActiveLight(prevLight => {
        if (prevLight === 'red') return 'green';
        if (prevLight === 'green') return 'yellow';
        return 'red';
      });
    }, 2000);

    return () => clearInterval(timer);
  }, []);

  return activeLight;
};

export default useTrafficLight;

这些方法可以根据实际需求选择使用,第一种方法适合简单场景,第二种方法通过 CSS 增强了视觉效果,第三种方法通过自定义 Hook 提高了代码的可维护性。

标签: 红绿灯react
分享给朋友:

相关文章

如何评价react native

如何评价react native

React Native 的优势 跨平台开发效率高 React Native 允许开发者使用 JavaScript 和 React 编写代码,同时生成 iOS 和 Android 应用,大幅减少开发成…

react中monent如何获取日期

react中monent如何获取日期

使用 Moment.js 获取当前日期 在 React 中通过 Moment.js 获取当前日期,可以直接调用 moment() 函数。它会返回包含当前日期和时间的 Moment 对象。 impo…

react 如何引入jquery

react 如何引入jquery

引入 jQuery 到 React 项目 在 React 项目中引入 jQuery 可以通过多种方式实现,但需要注意 React 和 jQuery 操作 DOM 的方式可能冲突,因此建议仅在必要时使用…

react如何销毁

react如何销毁

React 组件销毁的机制 在 React 中,组件的销毁通常由 React 的生命周期管理。当组件从 DOM 中移除时,React 会自动触发销毁相关的生命周期方法。以下是关键点: 组件的销毁通常…

react性能如何

react性能如何

React 性能特点 React 通过虚拟 DOM(Virtual DOM)和高效的 diff 算法优化性能。虚拟 DOM 减少了直接操作真实 DOM 的开销,仅在必要时更新变化的部分。React 的…

react如何衰减

react如何衰减

React 中的动画衰减效果实现 在 React 中实现衰减效果(如滚动衰减、拖动释放后的惯性滑动)通常需要结合物理动画原理或第三方动画库。以下是几种常见方法: 使用 CSS 动画和 @keyf…