一、需求分析

这里我是用Echarts的柱状图,倒置下y轴x轴就实现了,然后产品说跟UI不一致

我一看UI这种又给我整不会了,然后想拿Echarts改改参数搞定,同事和群友都是说自己做,不要用Echarts改

二、实现思路

同事劝我用ElementUI的进度条组件来实现,进度条见:

https://element.eleme.io/#/zh-CN/component/progress

想了下这个思路还是可行的,上面的标题自定义起来还算方便

然后花了点时间抓的进度条的样式

组件解析后是这样的:

<div class="el-progress-bar">
<div class="el-progress-bar__outer" style="height: 20px; background-color: rgb(235, 238, 245);">
<div class="el-progress-bar__inner" style="width: 44%; background-color: rgb(27, 189, 236);"></div>
</div>
</div>

一个bar嵌套 一个outer和inner

outer就是百分百的长度,outer是相对定位

inner用来展示占比的长度,inner是绝对定位

所以在做UI效果的时候花了很多时间琢磨这个东西,outer来设置底部边框线

然后想通过设置外边距和内边距来拉开inner的间隙,在知道是绝对定位后,改用top定位属性才拉开

这里我直接上效果图:

自己封装的RankCharts组件:

<template>
<div>
<div v-for="(item, idx) in rankList" :key="idx" style="margin-bottom: 15px;">
<div class="rank-header"><span>No.{{ idx + 1 }} {{ item[labelField] }}</span> <span style="float: right">{{ item[countField] }}</span></div>
<el-progress :percentage="item.percent" :stroke-width="15" :color="customColor" text-inside :show-text="false" />
</div>
</div>
</template> <script>
export default {
name: 'RankCharts',
props: {
rankList: {
type: Array,
required: true,
default: () => []
},
labelField: {
type: String,
required: true,
default: ''
},
countField: {
type: String,
required: true,
default: ''
}
},
data() {
return {
customColor: '#1BBDEC',
completeVal: 0
}
}
}
</script> <style scoped>
/* 进度条的圆角移除 */
/deep/ .el-progress-bar__outer,
/deep/ .el-progress-bar__inner {
border-radius: 0;
}
/* 移除进度条的底色,设置底部百分百线条 */
/deep/ .el-progress-bar__outer {
background-color: unset !important;
border-bottom: 1px #1BBDEC solid;
}
/* 拉开进度条底线和占比的间距 */
/deep/ .el-progress-bar__inner {
top: -2px;
}
/* 进度条上面的排名信息展示 */
.rank-header {
color: #1BBDEC;
margin-bottom: 5px;
font-size: 18px;
}
</style>

  

组件使用:

<rank-charts :rank-list="carSourceList" count-field="val" label-field="label" style="padding: 10px;" />

接口数据处理:

因为进度条组件的进度是自己计算的,排名按最多的那个为100%来算

设置一个percent属性即可实现

 async initializeCarSourceData(regionCode, [startTime, endTime]) {
const { data: carSourceData } = await getStatisticDataAnalysisOfCarSource(regionCode, { startTime, endTime })
this.carSourceList = carSourceData['countList'].map((val, idx, arr) => ({
val,
label: carSourceData['nameList'][idx],
percent: (val / arr[0]).toFixed(2) * 100
}))
},

  

  

【Vue】自己编写排名组件的更多相关文章

  1. VUE创建播发器组件并调用

    欢迎来到我的友链小屋   首先用vue-cli创建前端项目 参考:https://www.cnblogs.com/ouyangkai/p/11549290.html 新建play.vue文件 编写pl ...

  2. Vue.js学习 Item11 – 组件与组件间的通信

    什么是组件? 组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能.在有 ...

  3. vue插件编写与实战

    关于 微信公众号:前端呼啦圈(Love-FED) 我的博客:劳卜的博客 知乎专栏:前端呼啦圈 前言 热爱vue开发的同学肯定知道awesome-vue 这个github地址,里面包含了数以千计的vue ...

  4. 【Vue】---编写Vue插件流程---【巷子】

    一.在Vue中编写插件流程 1.创建组件 components/message.vue <template> <div class="message" v-if= ...

  5. Vue:实践学习笔记(3)——组件使用

    Vue:实践学习笔记(3)——组件使用 全局注册 1.注册组件 Vue.component('my-component',{ //选项 }) 说明:my-component就是注册的组件自定义的标签名 ...

  6. Vue.js的动态组件模板

    组件并不总是具有相同的结构.有时需要管理许多不同的状态.异步执行此操作会很有帮助. 实例: 组件模板某些网页中用于多个位置,例如通知,注释和附件.让我们来一起看一下评论,看一下我表达的意思是什么.评论 ...

  7. Vue的指令以及组件化开发

    一. 自定义指令 如何: 1. 创建指令 Vue.directive("指令名",{ inserted(elem){//指令所在的元素被加载到DOM树上后自动执行指令 //elem ...

  8. Vue插件编写、用法详解(附demo)

    Vue插件编写.用法详解(附demo) 1.概述 简单来说,插件就是指对Vue的功能的增强或补充. 比如说,让你在每个单页面的组件里,都可以调用某个方法,或者共享使用某个变量,或者在某个方法之前执行一 ...

  9. Vue源码之组件化/生命周期(个人向)

    大致流程 具体流程 组件化 (createComponent) 构造⼦类构造函数 const baseCtor = context.$options._base // plain options ob ...

  10. 基于Vue搭建自己的组件库(1)

    本项目演示地址:https://husilang.github.io/zm-ui 项目参考文章:从零开始搭建Vue组件库 VV-UI 项目的初衷是学习怎么封装一个基于Vue的UI组件库,顺便记录每个步 ...

随机推荐

  1. 解决 Https 站点请求 Http 接口服务后报 the content must be served over HTTPS 错误的问题

    问题分析 之前将自己所有的 Http 站点全部更新为 Https 站点,但是在请求后台接口服务的时候还是 Http 请求,导致部署之后,直接在控制台报 This request has been bl ...

  2. 基于Vue的二进制时钟组件 -- fx67llBinaryClock

    fx67llClock Easy & Good Clock ! npm 组件说明 一个基于Vue的二进制时钟组件,没什么卵用,做着好玩,可以方便您装饰个人主页 使用步骤 npm install ...

  3. CF98C Help Greg the Dwarf 题解

    CF98C Help Greg the Dwarf 题解 为什么不三分? 首先我们考虑如何求出答案. 如图,考虑设夹角为 \(\theta\),那么可以得到表达式: \[[\cfrac a {\tan ...

  4. k8s 安装ingress nginx controller 并部署.net core ingress服务

    k8s 安装ingress nginx controller 并部署.net core ingress服务 本地k8s集群概览 192.168.28.132 k8smaster 192.168.28. ...

  5. 使用vscode写Markdown并且导出为pdf(干货)

    目录 序言 下载vscode 安装插件 markdown语法 导出为pdf 序言 大家在学习过程中都会有记笔记的好习惯(美观的笔记当然是上上选),于是,Markdown就是一个不错的选择,待会也会附上 ...

  6. Jx9 虚拟机

    一.Jx9 虚拟机的生命周期 加载 Jx9 脚本 jx9_compile() 或 jx9_compile_file(),加载编译成功后,Jx9 引擎将自动创建一个实例 (jx9_vm) 并且返回指向此 ...

  7. 【题解】CatOJ C0458C 滑动窗口定期重构

    标题 trick 的名字我也不知道是什么,就这样吧. 首先有显然的 dp 式子:\(f(i)=\min \{f(j) \times \max\{a_{j+1},\dots,a_i\}\}\).考虑怎么 ...

  8. Debezium-Flink-Hudi:实时流式CDC

    1. 什么是Debezium Debezium是一个开源的分布式平台,用于捕捉变化数据(change data capture)的场景.它可以捕捉数据库中的事件变化(例如表的增.删.改等),并将其转为 ...

  9. 什么是Selenium Grid?如何搭建Selenium Grid?

    标签(空格分隔): 测试架构 什么是测试基础架构? 测试基础架构指的是,执行测试的过程中用到的所有基础硬件设施以及相关的软件设施.因此,我们也把测试基础架构称之为广义的测试执行环境.通常来讲,测试基础 ...

  10. P8451 题解

    显然,题面明摆着让你写一个可持久化 AC 自动机. 但是从空间来说这是不可能的. 想起做 不强制在线 的可持久化数据结构的一种方法,建立"时光树",具体来说,假若版本 \(x\) ...