【阶梯进度条实现方法】

阶梯进度条实现方法

主要针对进度指针的计算方式,无样式代码
图一

在这里插入图片描述
图二
在这里插入图片描述
进度条阶梯数量为动态的 最少数量为一个阶梯
阶梯为平分进度但是每个阶梯的达成人数式是不一样的
看下图为三阶梯式的进度条
在这里插入图片描述
后台数据格式
在这里插入图片描述
一阶梯:累计邀请3个人 可达成 完成当前阶梯需要邀请3人
二阶梯:累计邀请6个人 可达成 完成当前阶梯需要邀请3人
三阶梯:累计邀请10个人 可达成 完成当前阶梯需要邀请4人

假如邀请了3个人完成了第一阶梯那么进度条的进度应该是当前阶段进度的100%,总进度的33%
可以判断领奖状态为可领奖时 拿这个阶梯索引加1 与 阶梯数组总长度 换算百分比就出来了,不用算当前阶梯的进度 就可以直接换算总进度了

假如总邀请了4个人完成了第一阶梯,并且在二阶梯完成了1/3 的进度
这个时候总进度该怎么算
使用循环 先判断已完成的阶梯
他完成了一阶梯 那么进度就是33%
然后计算在第二阶梯已邀请的人数
我这里是后台返回了 当前阶梯还需要还需要邀请多少人
那么我可以直接拿当前阶梯的达成人数减去上一个阶梯的达城人数
就算出来了 完成当前阶梯所需的人数
拿到当前阶梯所需的人数 减去 当前阶梯还需要还需要邀请多少人
就得出来当前阶梯已经邀请了多少人 == 1
那么在第二阶梯里的进度就是33%
这个时候就需要计算总进度了
我们已经有了第一阶梯占总进度的33%
第二阶梯站总进度的百分比 = (完成当前阶梯所需的人数 / 当前阶梯已经邀请了多少人)/ 阶梯数量
11% = (1/3)/ 3
在拿上面的已完成总进度加上当前阶段所占的总进度就得出
33% + 11% = 44%
这种做法可以避免在活动进行中的时候,后台修改了某个阶梯的达成人数导致的前端进度计算出错的问题,不使用总数计算也是为了防止修改已完成阶梯的达成人数。

代码实现

<template>
	<div>
		<lyzProgress :width="percentageNum"></lyzProgress>
	</div>
</template>

<script>
import lyzProgress from '@/components/lyz-progress/lyz-progress.vue'
export default {
  components: { lyzProgress },
  props: {
    progress: {
      type: Array,
      default: () => {
        return [
          {
            stageId: 1, // 阶段id
            sort: 0, // 序号
            gradeNum: 3, // 达标人数
            disableStatus: 1, // "禁用状态 0禁用 1不禁用"
            rewardStatus: 1 // 领奖状态 0不可领奖 1可以领奖
          }, {
            stageId: 10, // 阶段id
            sort: 1, // 序号
            gradeNum: 6, // 达标人数
            disableStatus: 1, // "禁用状态 0禁用 1不禁用"
            rewardStatus: 0 // 领奖状态 0不可领奖 1可以领奖
          }, {
            stageId: 11, // 阶段id
            sort: 2, // 序号
            gradeNum: 10, // 达标人数
            disableStatus: 1, // "禁用状态 0禁用 1不禁用"
            rewardStatus: 0 // 领奖状态 0不可领奖 1可以领奖
          }
        ]
      }
    }
  },
  data() {
    return {
      numTemp: 2,
      percentageNum: 0
    }
  },
  mounted() {
    this.getProgressNum()
    this.$nextTick(() => {
      console.log(this.percentageNum)
    })
  },
  methods: {
    percentage(val, total) {
      if (val === 0 || total === 0) {
        return 0
      }
      const i = (Math.round(val / total * 10000) / 100.00)
      if (i > 100) {
        return 100 // 小数点后两位百分比
      } else if (i <= 100 && i >= 0) {
        return i // 小数点后两位百分比
      } else {
        return 0 // 小数点后两位百分比
      }
    },
    // 阶梯进度条算法
    getProgressNum() {
      this.percentageNum = 0
      for (let index = 0; index < this.progress.length; index++) {
        let differenceNum = 0
        const item = this.progress[index]
        if (item.rewardStatus === 1) {
          this.percentageNum = this.percentage(index + 1, this.progress.length)
        } else {
          let s = 0 // 当前阶段达成所需人数
          s = index === 0 ? item.gradeNum : item.gradeNum - this.progress[index === 0 ? 0 : index - 1].gradeNum
          differenceNum = s - this.numTemp // 当前阶段已邀请人数
          this.percentageNum += this.percentage(differenceNum, s) / this.progress.length
          return
        }
      }
    }
  }
}
</script>

<style scoped lang='scss'>
</style>

计算出的进度
在这里插入图片描述
我项目中用了几次,这个计算还是比较有意思的,所以就记录一下!

个人uniapp插件主页

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

国大创软

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值