react写的一个九宫格抽奖活动

先看效果

在这里插入图片描述

代码如下:

父组件:

import React, { Component } from 'react'
import DeomItem from './demo_item.jsx' // 引入子组件
export default class demo extends Component {
  constructor(props) {
    super(props);
    this.state = {
      // 九宫格内容list
      list: [
        {id: 1, name: '1.2%财富券'},
        {id: 2, name: '1.0%财富券'},
        {id: 3, name: '1.4%财富券'},
        {id: 4, name: '1.1%财富券'},
        {id: 5, name: '电视'},
        {id: 6, name: '冰箱'},
        {id: 7, name: '洗衣机'},
        {id: 8, name: '手机'},
        {id: 9, name: '手机1'},
        {id: 10, name: '手机2'},
        {id: 11, name: '手机3'},
        {id: 12, name: '手机4'}
      ],
      // 被选中的格子的ID
      activedId: '',
      // 中奖ID
      prizeId: null,
      // 获得prizeId之后计算出的动画次数
      times: 0,
      // 当前动画次数
      actTimes: 0,
      // 是否正在抽奖
      isRolling: false
    }
  }
  handleBegin() {
    // this.state.isRolling为false的时候才能开始抽,不然会重复抽取,造成无法预知的后果
    if (!this.state.isRolling) {
      // 点击抽奖之后,我个人做法是将于九宫格有关的状态都还原默认
      this.setState({
        activedId: '',
        prizeId: null,
        times: 0,
        actTimes: 0,
        isRolling: true
      }, () => {
        // 状态还原之后才能开始真正的抽奖
        this.handlePlay()
      })
    }
  }
  handlePlay() {
    // 中将id,可随机,可自己设定,我这里暂且定为4
    let prize = 4
    console.log(prize)
    this.setState({
      prizeId: prize,
      activedId: 0
    })
    // 随机算出一个动画执行的最小次数,这里可以随机变更数值,按自己的需求来
    let times = this.state.list.length * Math.floor(Math.random() * 5 + 4)
    this.setState({
      times: times
    })
    // 抽奖正式开始
    this.begin = setInterval(() => {
      let num;

      if (this.state.activedId === this.state.prizeId && this.state.actTimes > this.state.times) {
        // 符合上述所有条件时才是中奖的时候,两个ID相同并且动画执行的次数大于(或等于也行)设定的最小次数
        clearInterval(this.begin)
        this.setState({
          isRolling: false
        })
        return
      }

      // 以下是动画执行时对id的判断
      if (this.state.activedId === '') {
        num = 0
        this.setState({
          activedId: num
        })
      } else {
        num = this.state.activedId
        if (num === 11) {
          num = 0
          this.setState({
            activedId: num
          })
        } else {
          num = num + 1
          this.setState({
            activedId: num
          })
        }
      }

      this.setState({
        actTimes: this.state.actTimes + 1
      })

    }, 40)
  }
  render() {
    const { list, activedId } = this.state;
    return (
      <div className="demo">
        <div className="start_button" onClick={() => this.handleBegin()}>开始</div>
        <div className="one">
          <DeomItem content={list[0]} activedId={activedId}></DeomItem>
          <DeomItem content={list[1]} activedId={activedId}></DeomItem>
          <DeomItem content={list[2]} activedId={activedId}></DeomItem>
          <DeomItem content={list[3]} activedId={activedId}></DeomItem>
        </div>
        <div className="one">
          <DeomItem content={list[11]} activedId={activedId}></DeomItem>
          <DeomItem content={list[4]} activedId={activedId}></DeomItem>
        </div>
        <div className="one">
          <DeomItem content={list[10]} activedId={activedId}></DeomItem>
          <DeomItem content={list[5]} activedId={activedId}></DeomItem>
        </div>
        <div className="one">
          <DeomItem content={list[9]} activedId={activedId}></DeomItem>
          <DeomItem content={list[8]} activedId={activedId}></DeomItem>
          <DeomItem content={list[7]} activedId={activedId}></DeomItem>
          <DeomItem content={list[6]} activedId={activedId}></DeomItem>
        </div>
      </div>
    );
  }
}

子组件:

import React, { Component } from 'react'
export default class demoItem extends Component {
  constructor(props) {
    super(props);
    this.state = {};
  }

  render() {
    const { content, activedId } = this.props;
    return (
      <div className={activedId === content.id ? 'row_item row_item-active' : 'row_item'} id={`row_item_${content}`}>
        {content.name}
      </div>
    );
  }
}

css样式:
我这里用的是scss

@function rem($px){
  @return $px * 36 / 7200 + rem;
}
.demo {
  height: rem(655);
  margin: rem(20);
  border: 1px solid #333;
  background: #fff;
  position: relative;
  .start_button {
    display: flex;
    justify-content: center;
    position: absolute;
    left: calc(50% - 40px);
    top: calc(50% - 20px);
    width: rem(150);
    height: rem(60);
    line-height: rem(60);
    text-align: center;
    background: aliceblue;
  }
  .one {
    width: 100%;
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: 10px;
    .row_item {
      width: rem(150);
      height: rem(150);
      line-height: rem(150);
      text-align: center;
      background: #f0f0f0;
    }
    .row_item-active {
     background: aquamarine;
     animation: blink 1s 3;
    }
    @keyframes blink{
      to {
        color: transparent;
      }
    }
  }
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
React九宫格抽奖是一种通过使用React框架来实现抽奖游戏。在这个游戏中,用户点击抽奖按钮后,九宫格开始旋转,并最终停在一个奖项上。 在实现这个功能的过程中,可以使用以下方法: 1. 首先,在点击抽奖按钮时,执行handleClick方法。这个方法会调用start方法来开始九宫格的旋转,并发起一个请求来获取奖项。 2. 在start方法中,首先设置九宫格的起始位置,结果序号和旋转速度。然后,使用定时器来控制九宫格的旋转。在每次定时器触发时,判断是否达到了预定的结果序号。如果没有达到,则继续旋转,并更新九宫格活动位置。 3. 在每次旋转时,根据活动位置的变化,更新九宫格中奖项的激活状态,并将更新后的状态应用到界面上。 4. 当九宫格达到了预定的结果序号时,停止旋转,并展示中奖弹窗。 5. 可以使用setTimeout来延迟展示中奖弹窗的时间,并在展示完成后清除定时器。 通过以上步骤,就可以实现React九宫格抽奖游戏。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [react实现九宫格抽奖 - h5](https://blog.csdn.net/qq_16726735/article/details/121405662)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [React九宫格抽奖](https://blog.csdn.net/aoba8934/article/details/102322360)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值