vue中封装自动计算比例滑块

news2024/11/25 20:18:18

 

 

 此插件为另一位漂亮的前端同事小姐姐封装,觉得非常好用于是决定记载下来,便于复用

如图需要动态传入需要分配权重的数组,平均分配可以自动将100%平均分给数组中的值

 如果手动拖拽,则会自动计算可拖动最大区域,便于最终总权重必定为100%

<el-alert class="merge-alert" type="warning" :closable="false">
          <div slot="title" class="display-flex">
            <div style="height:28px;line-height:28px">所选的参与评分类型权重加起来应等于100%,已配置 <span style="font-weighScore:600">{{ totalWeight || 0 }}</span> %。</div>
            <el-button @click="setAllExpWeight" size="mini" type="text">平均分配</el-button>
          </div>
        </el-alert>
        <el-divider></el-divider>
        <div class="course-exp-weighScore-list">
          <div v-for="item in form.courseObjectiveWeightList" :key="item.id">
            <div style="padding:10px;">
              <el-row type="flex" justify="space-between">
                <el-col :span="24">
                  <p>{{item.name}} </p>
                </el-col>
              </el-row>
              <el-row type="flex" justify="space-between" :gutter="13">
                <el-col :span="16" style="padding-left: 15px;">
                  <ultralabx-slider v-model="item.weight" :max="referenceWeight[item.id]"></ultralabx-slider>
                </el-col>
                <el-col class="text-right" :span="8">
                  <el-input-number v-model="item.weight" size="mini" :min="0" :max="referenceWeight[item.id]" :precision="0"></el-input-number>
                  %
                </el-col>
              </el-row>
            </div>
            <div class="dashed"></div>
          </div>
        </div>



  components: {
    ultralabxSlider,
  },
  computed: {
    totalWeight() {
      let total = 0;
      this.form.courseObjectiveWeightList.forEach((item) => {
        total += item.weight;
      });
      return total;
    },
    referenceWeight() {
      let obj = {};
      this.form.courseObjectiveWeightList.forEach((item) => {
        let { id } = item;
        obj[id] = 100;
        this.form.courseObjectiveWeightList
          .filter((item) => item.id !== id)
          .forEach((item) => {
            obj[id] -= item.weight || 0;
          });
        if (obj[id] < 0) {
          obj[id] = 0;
        }
      });
      return obj;
    },
  },

  methods:{
    setAllExpWeight() {
      //平均分配
      let weightArr = this.disNumber(
        100,
        this.form.courseObjectiveWeightList.length
      );
      this.form.courseObjectiveWeightList.map((item, index) => {
        item.weight = weightArr[index];
      });
    },
   disNumber(num, len) {
     let average = Math.floor(num / len)
     let remainder = num % len
     let arr = new Array(len).fill(average)
     if (remainder > 0) {
      for (let i = 0; i < remainder; i++) {
         arr[i]++
      }
     }
      return arr
     }
  }

// 模拟数据 ,需要自行替换
form.courseObjectiveWeightList = [ { "id": "1689911475658219522", "name": "好好生活啊", "weight": 0 }, { "id": "1689910525744832514", "name": "好日子", "weight": 0 }, { "id": "1689156584639741954", "name": "实验知识1", "weight": 0 } ]

 下面是封装ultralabx-slider组件需要联动使用

<template>
  <div class="ultralabx-slider-box">
    <el-slider class="down-slider" v-model="maxNumber" :marks="{[maxNumber]: `${maxNumber}%`}" disabled></el-slider>
    <el-slider class="up-slider" v-model="curNumber" :max="maxNumber" :disabled="disabled" :style="`width: ${maxNumber}%`"></el-slider>

  </div>
</template>

<script>
export default {
  name: "ultralabxSlider",
  props: {
    value: {
      type: Number,
      default: 0,
    },
    max: {
      type: Number,
      default: 100,
    },
    disabled: {
      type: Boolean,
      default: false,
    },
  },
  watch: {
    value: {
      immediate: true,
      handler(val) {
        if (val === this.curNumber) {
          return;
        }
        this.curNumber = val;
      },
    },
    max: {
      immediate: true,
      handler(val) {
        this.maxNumber = val;
      },
    },
    curNumber: {
      immediate: true,
      handler(val) {
        if (val === this.value) {
          return;
        }
        this.$emit("input", val);
      },
    },
  },
  data() {
    return {
      curNumber: 0,
      maxNumber: 100,
    };
  },
};
</script>

<style lang="scss">
.ultralabx-slider-box {
  .el-slider__button {
    width: 10px;
    height: 10px;
    border-width: 4px;
  }

  .el-slider__bar,
  .el-slider__runway {
    height: 4px;
    border: 1px solid transparent;
    top: -1px;
  }

  .el-slider__button-wrapper {
    top: -16px;
  }

  .up-slider {
    .el-slider__runway {
      background-color: transparent;
    }

    .el-slider__bar {
      border: 1px solid #409eff;
    }
  }

  .down-slider {
    .el-slider__runway {
      border-color: #e4e7ed;

      &.disabled .el-slider__button {
        border: 1px dashed #ff8e1f;
      }
    }

    .el-slider__bar {
      border-color: #ff8e1f;
      border-style: dashed;
      background-color: #ffffff;
    }

    .el-slider__marks-text {
      color: #ff8e1f;
      font-size: 12px;
      line-height: 2.3;
      white-space: nowrap;
      bottom: 0.333333em;
      margin-top: 0;
    }
  }
}
</style>

<style lang="scss" scoped>
.ultralabx-slider-box {
  position: relative;

  .up-slider {
    position: absolute;
    left: 0;
    top: 0;
    z-index: 1001;
  }

  .down-slider {
  }
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/876309.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【深度学习 | 梯度那些事】 梯度爆炸或消失导致的模型收敛困难?挑战与解决方案一览, 确定不来看看?

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

minio 分布式文件系统主从复制

1. 在slave节点下载mc客户端工具 下载 2. 移动或复制mc文件到/usr/local/bin/文件夹 mv mc /usr/local/bin 3. 赋值权限给 mc 文件 chmod x mc 4. 查看mc客户端版本,看是否可用 #控制台显示返回信息用下面这条 mc --version #控制台显示无返回信息用下面这条 mc --versi…

LeetCode ACM模式——二叉树篇(一)

刷题顺序及思路来源于代码随想录&#xff0c;网站地址&#xff1a;https://programmercarl.com 目录 定义二叉树 创建二叉树 利用前序遍历创建二叉树 利用数组创建二叉树 打印二叉树 144. 二叉树的前序遍历 递归遍历 迭代遍历&#xff08;利用栈&#xff09; 145. 二…

移动端预览指定链接的pdf文件流

场景 直接展示外部系统返回的获取文件流时出现了跨域问题&#xff1a; 解决办法 1. 外部系统返回的请求头中调整&#xff08;但是其他系统不会给你改的&#xff09; 2. 我们系统后台获取文件流并转为新的文件流提供给前端 /** 获取传入url文件流 */ GetMapping("/get…

43 | 抖音大V人民日报粉丝数分析

背景介绍 抖音是一个面向全年龄的音乐短视频社区平台,如今已成为最火的短视频软件,无数短视频创作者通过抖音分享生活,分享技能,分享美好。其中有点赞、评论、转发、关注等功能。 我们试图分析“大 V”即粉丝数量相对较多的博主的涨粉数量和点赞、评论、转发之间的关系,…

uniapp的逆地理编码 和地理编码

1.先打开高德地图api找到那个 地理编码 2.封装好我们的请求 3.逆地理编码 和地理编码 都是固定的 记住自己封装的请求 就可以了 这个 是固定的 方式 下面这个是固定的 可以复制过去 getlocation就是uniapp提供的 获取经纬度 然后 下面的 就是高德地图提供的 方法 要想使用我…

git Authentication failed

情况是这样的&#xff0c;之前看代码只是clone了一份&#xff0c;但随着分支越来越多&#xff0c;有时候切换分支时必须先把修改的代码 stash 一下&#xff0c;觉得很麻烦&#xff0c;于是又clone了一份代码。然后pull代码是正常的&#xff0c;当push 代码的时候&#xff0c;去…

Python深度学习“四大名著”之一全新PyTorch版 | 送书活动

目录 前言一、序二、内容简介三、作者简介四、福利(本次活动赠书2-5本&#xff0c;根据阅读量&#xff0c;评论区抽取小伙伴送书)总结 前言 近年来&#xff0c;机器学习方法凭借其理解海量数据和自主决策的能力&#xff0c;已在医疗保健、 机器人、生物学、物理学、大众消费和互…

Java多线程编程:实现并发处理的高效利器

Java多线程编程&#xff1a;实现并发处理的高效利器 作者&#xff1a;Stevedash 发表于&#xff1a;2023年8月13日 20点45分 来源&#xff1a;Java 多线程编程 | 菜鸟教程 (runoob.com) ​ 在计算机领域&#xff0c;多线程编程是一项重要的技术&#xff0c;可以使程序同时执…

Linux 性能分析之iostat命令详解

Linux 性能分析之iostat命令详解 iostat命令是IO性能分析的常用工具&#xff0c;其是input/output statistics的缩写。本文将着重于下面几个方面介绍iostat命令&#xff1a; iostat的安装iostat命令行选项说明iostat输出内容分析如何确定磁盘IO的瓶颈iostat实际案例 命令的安…

【先进PID控制算法(ADRC,TD,ESO)加入永磁同步电机发电控制仿真模型研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Linux 介绍

Linux一切皆文件&#xff1a;文件就 读、写、权限 学习方式&#xff1a; 1、认识Linux 2、基本的命令&#xff08;重点&#xff1a;git讲了一些基本的命令【文件操作、目录管理、文件属性、Vim编辑器、账号管理、磁盘管理…】&#xff09; 3、软件的安装和部署&#xff01;&am…

MongoDB 简介

什么是MongoDB ? MongoDB 是由C语言编写的&#xff0c;是一个基于分布式文件存储的开源数据库系统。 在高负载的情况下&#xff0c;添加更多的节点&#xff0c;可以保证服务器性能。 MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB 将数据存储为一个…

kubernetes二进制部署2之 CNI 网络组件部署

CNI 网络组件部署 一&#xff1a;K8S提供三大接口1容器运行时接口CRI2云原生网络接口CNI3云原生存储接口CSI 部署 flannelK8S 中 Pod 网络通信&#xff1a;Overlay Network&#xff1a;VXLAN&#xff1a;Flannel:Flannel udp 模式的工作原理&#xff1a;ETCD 之 Flannel 提供说…

Springboot 实践(2)MyEclipse2019创建项目修改pom文件,加载springboot 及swagger-ui jar包

MyEclipse2019创建工程之后&#xff0c;需要添加Springboot启动函数、添加application.yml配置文件、修改pom文件添加项目使用的jar包。 添加Springboot启动函数 创建文件存储路径 &#xff08;1&#xff09;右键单击“src/main/java”文件夹&#xff0c;弹出对话框输入路径…

电压放大器和电荷放大器区别是什么意思

电压放大器和电荷放大器是两种常见的信号放大器。它们的区别主要在于其输入端口所呈现的电路特性不同。 电压放大器的介绍 电压放大器是一种将输入信号的电压增益放大的电路元件&#xff0c;其输入端口呈现高阻抗特性。即在输入端口上&#xff0c;电压放大器所对应的电路模型中…

为什么我不推荐任何人用C语言作为编程启蒙第一课?

前言 写了20多年的代码&#xff0c;之前做过阿里的高级架构师&#xff0c;在技术这条路上跌跌撞撞了很多&#xff0c;我今天分享一些我个人的自学方法给各位。为什么我会说&#xff1a;不推荐任何人用C语言作为编程启蒙第一课&#xff1f; 这里有很多同学要站出来说了&#x…

人工智能在公检系统中的应用:校对软件助推刑事侦查工作

人工智能在公检系统中的应用&#xff0c;尤其是校对软件的应用&#xff0c;可以有效地助推刑事侦查工作。 以下是校对软件在刑事侦查工作中的一些应用方面&#xff1a; 1.自动校对和纠错&#xff1a;校对软件可以自动检测和纠正刑事侦查报告中的语法、拼写和标点错误等问题。通…

使用css实现时间线布局(TimeLine)

前言 在使用uni-app开发微信小程序过程中&#xff0c;遇到了时间轴布局&#xff0c;由于每项的内容高度不一致&#xff0c;使用uniapp自带的扩展组件uni-steps&#xff0c;样式布局无法对齐竖线&#xff0c;于是自己造轮子&#xff0c;完成特殊的布局。显示效果如下&#xff1…

[保研/考研机试] KY85 二叉树 北京大学复试上机题 C++实现

题目链接&#xff1a; 二叉树https://www.nowcoder.com/share/jump/437195121692000296981 描述 如上所示&#xff0c;由正整数1&#xff0c;2&#xff0c;3……组成了一颗特殊二叉树。我们已知这个二叉树的最后一个结点是n。现在的问题是&#xff0c;结点m所在的子树中一共包…