当前位置:首页 > React

react实现翻牌抽奖活动

2026-01-27 12:19:42React

实现翻牌抽奖的基本思路

翻牌抽奖活动的核心是通过点击卡片触发翻转动画,展示奖品信息。React中可通过状态管理控制翻转状态,结合CSS动画实现视觉效果。

核心代码结构

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

const FlipCard = () => {
  const [flipped, setFlipped] = useState(false);
  const [prize, setPrize] = useState('');

  const prizes = ['一等奖', '二等奖', '谢谢参与', '优惠券'];

  const handleFlip = () => {
    if (!flipped) {
      const randomPrize = prizes[Math.floor(Math.random() * prizes.length)];
      setPrize(randomPrize);
    }
    setFlipped(!flipped);
  };

  return (
    <div className={`flip-card ${flipped ? 'flipped' : ''}`} onClick={handleFlip}>
      <div className="flip-card-inner">
        <div className="flip-card-front">
          <div className="card-content">点击抽奖</div>
        </div>
        <div className="flip-card-back">
          <div className="card-content">{prize}</div>
        </div>
      </div>
    </div>
  );
};

配套CSS样式

.flip-card {
  perspective: 1000px;
  width: 200px;
  height: 300px;
  margin: 20px;
}

.flip-card-inner {
  position: relative;
  width: 100%;
  height: 100%;
  transition: transform 0.6s;
  transform-style: preserve-3d;
}

.flip-card.flipped .flip-card-inner {
  transform: rotateY(180deg);
}

.flip-card-front, .flip-card-back {
  position: absolute;
  width: 100%;
  height: 100%;
  backface-visibility: hidden;
  display: flex;
  justify-content: center;
  align-items: center;
  border-radius: 10px;
  box-shadow: 0 4px 8px rgba(0,0,0,0.1);
}

.flip-card-front {
  background-color: #ff4757;
  color: white;
}

.flip-card-back {
  background-color: #70a1ff;
  color: white;
  transform: rotateY(180deg);
}

.card-content {
  font-size: 24px;
  font-weight: bold;
}

多卡片布局实现

对于多个抽奖卡片的情况,可将单个卡片组件化:

const PrizeWall = () => {
  return (
    <div className="prize-wall">
      <FlipCard />
      <FlipCard />
      <FlipCard />
    </div>
  );
};

配套CSS:

.prize-wall {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
}

高级功能扩展

添加抽奖限制逻辑,防止重复抽奖:

const [hasDrawn, setHasDrawn] = useState(false);

const handleFlip = () => {
  if (hasDrawn) return;

  const randomPrize = prizes[Math.floor(Math.random() * prizes.length)];
  setPrize(randomPrize);
  setFlipped(true);
  setHasDrawn(true);
};

添加重置功能:

const handleReset = () => {
  setFlipped(false);
  setHasDrawn(false);
  setPrize('');
};

性能优化建议

使用React.memo优化卡片组件:

const MemoizedFlipCard = React.memo(FlipCard);

对于大量卡片的情况,考虑虚拟滚动技术:

import { FixedSizeList as List } from 'react-window';

const Row = ({ index, style }) => (
  <div style={style}>
    <FlipCard key={index} />
  </div>
);

const PrizeWall = () => (
  <List
    height={600}
    itemCount={100}
    itemSize={320}
    width={800}
  >
    {Row}
  </List>
);

动画增强方案

使用CSS变量控制动画速度:

.flip-card {
  --flip-duration: 0.6s;
}

.flip-card-inner {
  transition: transform var(--flip-duration);
}

添加弹簧动画效果:

.flip-card-inner {
  transition: transform 0.6s cubic-bezier(0.175, 0.885, 0.32, 1.275);
}

react实现翻牌抽奖活动

分享给朋友:

相关文章

如何学react

如何学react

学习 React 的基础知识 React 是一个用于构建用户界面的 JavaScript 库。学习 React 的第一步是掌握其核心概念,包括组件、状态(State)、属性(Props)和生命周期方法…

react如何保养

react如何保养

保持组件简洁 将大型组件拆分为更小、更专注的组件,每个组件只负责单一功能。避免在单个组件中处理过多逻辑或状态,这有助于提高可维护性和可测试性。 合理使用状态管理 根据应用复杂度选择状态管理方案。简单…

电脑如何安装react

电脑如何安装react

安装 Node.js 和 npm React 依赖于 Node.js 和 npm(Node Package Manager)。从 Node.js 官网下载并安装最新稳定版本,安装完成后会自动包含 np…

react如何部署

react如何部署

部署 React 应用的常见方法 使用静态服务器部署 React 应用在构建后会生成静态文件,可以直接通过静态服务器部署。常用的静态服务器包括 Nginx、Apache 等。 运行构建命令生成静态…

react架构如何

react架构如何

React 架构核心概念 React 的架构围绕组件化、虚拟 DOM 和单向数据流设计。组件是构建用户界面的独立模块,分为函数组件和类组件。虚拟 DOM 通过高效的 Diff 算法减少直接操作真实 D…

react如何读

react如何读

React 的发音 React 的发音为 /riˈækt/(音标),读作“瑞-艾克特”。其中: “Re” 发音类似英文单词 “read” 的开头部分。 “act” 发音与英文单词 “act” 一致。…