年会没中奖,老板买了一个抽奖程序

总结

这就https和http的区别总结了,这么快吗https域名? 还没到100行代码,老板买的抽奖程序,就这么简单吗?是否有内定前端名额?,好吧,那我们来在增加一个内定名额吧

如何100%中奖,

增加内定参数


const suerData={
    '一等奖':[701,702]
}

701 和 702 是我后前端开发需要学什么面增加的2个用户,后面我希望这 2 个用户获得一等奖

自定义 hooks

其实抽奖的核心都是随机数,我们只需要定义入参和出参,抽奖过程中的参数我们不关心, 所有我们可以抽取出一个自定义HTTP hoohttps域名k。

输入

  • users 所有用户
  • awards 所有奖项
  • sureData 内定名额

输出

  • toggle 开始或停止
  • award 当前抽的奖项
  • showUsers 显示的用户
  • result 中奖结果
const reducer = (state, payload) => ({ ...state, ...payload });
function useLottery(users, awards, sureData = {}) {
  // 是的在进行中
  const goingRef = useRef(false);
  const [state, setState] = useReducer(reducer, {
    current: awards.length - 1,
    over: false, //是否结束
    currentTime: 0, //  当前抽了几次
    winners: [], // 已经中奖用户,拥有用户数据过滤
    result: [], //  中奖结果输出
    showUsers: [], // 界面展示用户
    sure: sureData,
  });
  const { current, over, currentTime, winners, result, showUsers, sure } =
    state;
  // 当前抽几等奖奖
  const award = awards[current];
  // 一次抽几个
  const currentNumber = award.count / award.time;
  //currentWinNumber
  const currentWinNumber = currentTime * currentNumber;
  const toggle = () => {
    if (over) {
      return;
    }
    if (!goingRef.current) {
      if (award.count > currentWinNumber) {
        const winnerIds = winners.map((w) => w.id);
        let others = winnerIds.length
          ? users.filter((u) => !winnerIds.includes(u.id))
          : users;
        goingRef.current = setInterval(() => {
          setState({
            showUsers: randomCountUser(others, currentNumber),
          });
        }, 200);
      } else {
        if (current > 0) {
          setState({
            currentTime: 0,
            showUsers: [],
            current: current - 1,
          });
        } else {
          setState({
            over: true,
          });
        }
      }
    } else {
      clearInterval(goingRef.current);
      goingRef.current = false;
      // 最终显示用户,为了可以直接修改
      let finailyShowUsers = showUsers;
      let finailySureData = { ...sure };
      // 如果有内定名额逻辑
      if (Array.isArray(sure[award.name])) {
        finailyShowUsers = showUsers.map((p, index) => {
          let sureUser;
          sureUser = sure[award.name][index]
            ? users.find((u) => u.id === sure[award.name][index])
            : undefined;
          if (sureUser) {
            finailySureData[award.name] = sure[award.name].filter(
              (id) => id !== sureUser.id
            );
            return sureUser;
          } else {
            return p;
          }
        });
      }
      let sumWinners = result[award.name] || [];
      sumWinners = sumWinners.concat(finailyShowUsers);
      setState({
        winners: [...winners, ...finailyShowUsers],
        showUsers: finailyShowUsers,
        currentTime: currentTime + 1,
        sure: finailySureData,
        result: {
          ...result,
          [award.name]: sumWinners,
        },
      });
    }
  };
  return {
    toggle,
    result,
    award,
    showUsers,
  };
}

测试

使用 hooks

const { toggle, award, showUsers, result } = useLottery(users, awards, {
    三等奖: [701, 702],
  });

年会没中奖,老板买了一个抽奖程序

发布 npm 包

当然这个hook 我们可以发布一个 npm 包,未来说不定前端会开发移动端的抽奖前端是什么工作页面,我们可以公用这个抽奖逻辑,http://www.baidu.com只需要重新女配末世养崽日常写视图部分就好了 在发包之前,还需要对这个 hook 进行测试,这里我使用 @testing-library/react-hooks,在供品夫人这里就不展开叙述了,先预留一前端学什么篇文章《如何测试 reac前端工程师t hooks?》

最后

通过本文我学会了

  1. https安全问题布一个 react hooks npm 包
  2. 使用 github action 自动发布 npm 包
  3. 使用 gith女配没有求生欲藤萝为枝ub pages 部署预工商银行览页面
  4. 所有的抽奖程序都是随机数
  5. 是程序就可能会有内定名额

抽奖程序 plus(附加内定名额) 我也免费赠送给大家,希望各位喜欢。

  • 体验地址:maqi1520.gihttps认证thub.io/react-use-l…
  • npm: www.npmjs.com/package/@ma…
  • git前端和后端的区别hub: github.com/maqi1520/re…

全文结束女配没有求生欲txt, 记得点赞 . 希望这篇文章对大家有所帮助,也可以参考我往期的文章或者在评论区交流你的想法和心得,欢迎一起探索前端。