首页 > 其他分享 >vue电池电量组件

vue电池电量组件

时间:2024-12-19 09:25:07浏览次数:4  
标签:style vue color value batteryNum 电池电量 组件 border panel

代码

  <template>
      <!-- 电池电量Icon组件 -->
      <div class="electric-panel" :class="bgClass">
          <div class="panel" :style="{ transform: `rotate(${rotate}deg)` }">
              <div class="remainder" :style="{ width: batteryNum + '%' }" />
          </div>
          <div v-show="showText" :style="{ marginLeft: (parseFloat(rotate) ? 0 : '10') + 'px' }" class="text">
              <!-- 充电中不显示电量百分比 -->
              <template v-if="!proIsCharge">{{ batteryNum }}%</template>
              <template v-else>充电中</template>
          </div>
      </div>
  </template>

  <script setup>

  const props = defineProps({
      // 电池显示的数值
      quantity: {
          type: Number,
          default: 0,
      },
      // 是否显示电量百分比
      showText: {
          type: Boolean,
          default: true,
      },
      // 是否展示充电状态
      proIsCharge: {
          type: Boolean,
          default: false,
      },
      // 旋转百分比
      rotate: {
          type: String,
          default: '0',
      },
  });

  const batteryNum = ref(props.quantity);
  const bgClass = computed(() => {
      if (props.proIsCharge) return 'primary';
      if (batteryNum.value >= 30) {
          return 'success';
      } else if (batteryNum.value >= 15) {
          return 'warning';
      } else if (batteryNum.value >= 5) {
          return 'danger';
      } else {
          return 'danger';
      }
  });

  let myInterval = null;

  const handeRecharge = () => {
      clearInterval(myInterval);
      batteryNum.value = 0;
      if (props.proIsCharge) {
          myInterval = setInterval(() => {
              drawCharge();
          }, 500);
      }
  };

  const drawCharge = () => {
      batteryNum.value += 20;
      if (batteryNum.value > 100) {
          batteryNum.value = 0;
      }
  };

  onMounted(() => {
      if (props.proIsCharge) {
          handeRecharge();
      }
  });

  onBeforeUnmount(() => {
      if (myInterval) {
          clearInterval(myInterval);
      }
  });
  </script>

  <style lang="scss" scoped>
  // custom theme color
  $color-primary: #447ced;$color-success: #13ce66;
  $color-warning: #ffba00;$color-danger: #ff4949;
  $color-info: #909399;$color-white: #fff;

  @mixin panel-style($color) {
    .panel {
      border-color: $color;
      &::before {
        background: $color;
      }
      .remainder {
        background: $color;
      }
    }
    .text {
      color: $color;
    }
  }

  .electric-panel {
    display: flex;
    justify-content: center;
    align-items: center;
    &.primary {
      @include panel-style($color-primary);
    }

    &.success {
      @include panel-style($color-success);
    }
  
    &.warning {
      @include panel-style($color-warning);
    }
  
    &.danger {
      @include panel-style($color-danger);
    }
  
    .panel {
      box-sizing: border-box;
      width: 18px;
      height: 10px;
      position: relative;
      border: 1px solid #ccc;
      padding: 1px;
      border-radius: 2px;
      &::before {
        content: "";
        border-radius: 0 1px 1px 0;
        height: 4px;
        background: #ccc;
        width: 2px;
        position: absolute;
        top: 50%;
        right: -4px;
        transform: translateY(-50%);
      }
      .remainder {
        border-radius: 1px;
        position: relative;
        height: 100%;
        width: 0%;
        left: 0;
        top: 0;
        background: #fff;
      }
    }
  
    .text {
      text-align: left;
      width: auto;
      font-size: 13px;
    }
  }

  </style>

 

使用

  <quantity :quantity="JsonContent(item).bat_l" :proIsCharge="true" />

 

效果

 

标签:style,vue,color,value,batteryNum,电池电量,组件,border,panel
From: https://www.cnblogs.com/Wei-notes/p/18616344

相关文章

  • vue信号组件
    代码<template><divclass="signal-content"><divclass="signal-bars"><divv-for="(n,index)in5":key="n"class="bar":class="getBarClass(n)"......
  • vue多语言包i18n
    一、安装如果是vue2直接安装8.2.1版本,否则会出现版本不匹配的错误npminstallvue-i18n@8.2.1--save二、文件编辑在src目录下创建文件分别创建文件内容,内容为需要翻译的字段en.jsexportconsth={system:"Backgroundmanagementsystem",loginOut:"Lo......
  • 6.Group组件
    关于Group组件的简单介绍首先,Group组件本身并不是一个“布局”类的组件,它只是一个容器,没有提供调整内部组件展示位置的方法,也就是说,当我们将多个组件(比如button)放在group中时,他们(根据流式规则?)会全部挤在窗口的左上角,当然,如果我们没有设置组件的大小的话,那么大小也是默认的。......
  • 基于java的SpringBoot/SSM+Vue+uniapp的大学校园防疫与服务系统的详细设计和实现(源码
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • Element Plus组件库el-select组件多选回显踩坑
    前情公司有经常需要做一些后台管理页面,我们选择了ElementPlus,它是基于Vue3,面向设计师和开发者的组件库,是Vue框架生态中比较火的UI组件库,组件库丰富易用,组件链接:一个Vue3UI框架|ElementPlus,项目中经常会用到el-select多选功能,组件自带的多选交互也是非常棒的,标签回显示......
  • Shadcn UI 实战:打造可维护的企业级组件库
    "我们真的需要自己写一套组件库吗?"上周的技术评审会上,我正在和团队讨论组件库的选型。作为一个快速发展的创业公司,我们既需要高质量的组件,又想保持灵活的定制能力。在对比了多个方案后,我们选择了shadcn/ui这个相对较新的解决方案。说实话,最开始我对这个决定也有些担忧。毕......
  • Java基于springboot+vue的摄影设备租赁管理系统
    收藏关注不迷路!!......
  • 深入探索ArkWeb:构建高效且安全的Web组件
    深入探索ArkWeb:构建高效且安全的Web组件本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者......
  • 设计一个可复用的 ArkWeb 基础组件架构
    引言在华为鸿蒙开发环境中,ArkWeb组件是构建跨平台Web应用的重要工具。为了提高开发效率和组件复用性,我们需要设计一个健壮、可扩展的ArkWeb基础组件架构一、架构设计原则模块化模块化是组件设计的基础,它允许我们将复杂的系统分解为可管理的模块。在ArkWeb组件中,我们可......
  • Vue - 萤石云监控 ezuikit 视频实例销毁方案,解决使用stop方法无法销毁EZUIKit实例或销
    前言这方面教程很少,本文提供详细解决方案。在vue2|vue3项目开发中,项目集成对接萤石监控摄像头如何销毁EZUIKit实例教程,解决页面存在多个实时监控画面视频情况下,关闭某一个监控依然有声音和占用浏览器内存问题,另外如果要管理的摄像头监控播放器很多会导致分页情况下......