摆烂学习法之学习大转盘

290 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第25天,点击查看活动详情

🎉前言

每天下班不知道该学习什么?看实体书籍食之乏味?没有目标和动力?怎么办,想学却又不想学,不学又怕被人卷。那好,我们找个 学习大转盘 来帮助我们摇号,摇到谁,我就去看看相关的文章,就看两篇哦~~,看完就上号😍 。我总结该方法为 摆烂学习法 ,太对了哥,哥太对 ~~

🏠 ​基础布局

采用技术: Vue3 + TS + Vite

<template>
<div class="wrapper">
  <div class="content"
    v-for="item in contentList"
    :class="{ choice: item.num === curStep, pointer: item.num === 0 }"
    @click="handleClick(item.num)"
  >
    <img :src="item.image" alt="">
  </div>
</div>
</template>

样式类名 choice 实现转盘轮播选中效果,我就加了个透明度 opacity

样式类名 pointer 是给中间div加入👆 。

🎯 ​转盘实现

先上代码(DJ),先上代码(DJ)~~

✏️ ​数据结构:

const contentList = ref([
  {
    name: 'typescript',
    content_id: 'jsBook',
    image: '...',
    num: 1
  },
  {
    name: 'Vue',
    content_id: 'vue',
    image: '...',
    num: 2
  },
  {
    name: 'React',
    content_id: 'react',
    image: '...',
    num: 3
  },
  {
    name: '性能优化',
    content_id: 'optimization',
    image: '...',
    num: 8
  },
  {
    name: '开始学习',
    content_id: 'box',
    image: '...',
    num: 0
  },
  {
    name: '数据结构和算法',
    content_id: 'data_structure',
    image: '...',
    num: 4
  },
  {
    name: '摆烂',
    content_id: 'bailan',
    image: '...',
    num: 7
  },
  {
    name: '前端工程化',
    content_id: 'engineering',
    image: '...',
    num: 6
  },
  {
    name: '图解HTTP',
    content_id: 'http',
    image: '...',
    num: 5
  }
])

💥 ​核心代码:

<script setup lang="ts">
import {ref} from 'vue';
​
// 当前选中的步数
let curStep = ref(1);
// 总步数
let step = ref(0);
// 延迟毫秒
let delay = ref(100);
// alert弹出文字
let text = ref('');
// 是否可点击的开关
let isRun = ref(true);
​
const handleClick = (num) => {
  // 不是中间div,或者开关为false
  if (num !== 0 || !isRun.value) {
    return;
  }
  start();
}
​
const start = () => {
  // 随机生成总布数,24 ~ 48 之间 (大概3 ~ 6圈)
  step.value =  randomNumber(24, 48);
  isRun.value = false;
  let hasRun = 0;
  move(hasRun);
}
​
const move = (hasRun) => {
  const length = contentList.value.length - 1;
  setTimeout(() => {
    // 已经走的步数 小于等于 总的步数 说明还没到最后的一个
    if (hasRun <= step.value) {
      // (2) 怎么让最后两圈走得慢一些呢?
      if (step.value - hasRun < length * 2) {
        delay.value = 300;
      } else if (step.value - hasRun < length) {
        delay.value = 600;
      }
      // (1) 怎么让转盘 1,2,3,4,5,6,7,8  一直重复这几个数字呢?
      curStep.value = hasRun % length + 1;
      hasRun++;
      move(hasRun);
    } else {
      // 最后一个到了!!
      // 遍历找到对应的 name 属性,然后弹框
      contentList.value.find(item => {
        if (item.num === curStep.value) {
          text.value = item.name;
          if (curStep.value === 7) {
            alert(`学什么学,今天我要 ${text.value},耶稣都拦不住,我说的!!`);
            return;
          }
          alert(`今天可以学一学 ${text.value} 哦!`);
        }
      })
      // 初始化 delay 时间
      delay.value = 100;
      isRun.value = true;
    }
  }, delay.value)
}
​
// 随机数工具函数
const randomNumber = (min, max) => {
    return Math.floor(Math.random() * (max - min)) + min;
}
</script>

上述代码中比较麻烦的点是:

  • (1) 怎么让转盘 1,2,3,4,5,6,7,8 一直重复这几个数字呢?
  • (2) 怎么让最后两圈走得慢一些呢?

❓ ​问题一

(1) 怎么让转盘 1,2,3,4,5,6,7,8 一直重复这几个数字呢?

我们模拟一下如果不让转盘 1,2,3,4,5,6,7,8 一直重复会发生什么呢?

修改上述部分代码:

// (1) 怎么让转盘 1,2,3,4,5,6,7,8  一直重复这几个数字呢?
curStep.value = hasRun % length + 1;
​
// 修改为:
curStep.value = hasRun; // hasRun是正在执行的步数

看效果:

GIF 2022-4-26 0-21-39.gif

看左下角的 curStep,当数字到 8 时,转盘就不动了,是因为 hasRun 一直不断叠加,远远超过了 8 ,在HTML 结构中,我们是通过添加类名 choice: item.num === curStep 来判断走到哪个位置,超过了 8 那我给谁加样式呢~~

此时,我们需要处理一下 curStep 的赋值,利用取模运算来实现循环步数,先给大家看一张图:

image-20220426003655974.png

假设总的步数是 29 ,从 0 走到 29 ,如果一圈是 8 步 ,那么可以走 3 圈多,用 0~29 一直不断的取模,就能实现 0~7 一直循环了,在此基础上 +1 就可以了

❓ ​问题二

(2) 怎么让最后两圈走得慢一些呢?

总步数 减去 当前步数 等于 剩下的步数

上面我们知道一圈是 8 步,那么利用 剩下的步数 小于 (8 * 2) 时,也就是 最后两圈 要到了,就可以让轮盘走得慢一些了;同理 小于 8 时就代表要进入最后一圈了。

if (step.value - hasRun < length * 2) {
    delay.value = 300;
} else if (step.value - hasRun < length) {
    delay.value = 600;
}

👀 ​最终效果

GIF 2022-4-25 23-00-11.gif

哦?? 一发入魂? 看来今天是要... 😍😍

👉 演示的源代码在这里 Replit 链接。

✨总结

本文参考自 前端学习|不知道学点啥好,不如搞一个学习盲盒,在此基础上加入摆烂功能 😎 ,代码精简化并详细介绍了逻辑代码。

摆烂是不可能摆烂的,社区里的人实力又强,讲话又好听,我超喜欢这里的~~

希望大家每天都不要停止学习哦,哪怕是每天学一丢丢~~😝😝

以上就是本次分享的全部内容~~

如果觉得文章写得不错,对你有所启发的,请不要吝啬 点个 关注 并在 评论区 留下你宝贵的意见哦~~😃