携手创作,共同成长!这是我参与「AdminJS · 8 月更文挑战」的第4天,点击查看活动详情
简介
前文深入解读了线性环形/仪表盘进度条的代码实现。虽然组件提供了很多属性用来满足不同使用场景的下差异化配置,但是还缺少一些特性,例如 自定义进度条渐变色、仪表盘缺口大小、仪表盘缺口位置、分段进度条等。
接下来在源码的基础上,编码实现一些新特性,丰富组件功能。
仪表盘缺口大小
组件新增属性gapPercentage
,用于设置仪表盘进度缺口弧长所站百分比。数值范围根据实际情况可以设置。这里改写支持 dashboard
设置为 0
,等同于圆形进度条(进度起始位置在底部)。
gapPercentage: {
type: Number,
validator: val => val >= 0 && val < 100
},
源码可知仪表盘的缺口的弧长为四分之一(1-0.75
即 25%
)圆周长。
rate() {
return this.type === 'dashboard' ? 0.75 : 1;
},
trailPathStyle() {
return {
strokeDasharray: `${(this.perimeter * this.rate)}px, ${this.perimeter}px`,
strokeDashoffset: this.strokeDashoffset
};
},
新增计算属性 gapPer
返回缺口弧长(百分比),默认情况 dashboard
类型的缺口弧长为 25%
。
gapPer() {
// Support gapDeg = 0 when type = 'dashboard'
if (this.gapPercentage || this.gapPercentage === 0) {
return this.gapPercentage;
}
if (this.type === 'dashboard') {
return 25;
}
return undefined;
},
改写计算属性 rate
。
rate() {
return 1 - (this.gapPer || 0) / 100;
},
组件代码示例:
<el-progress type="dashboard" :percentage="20"></el-progress>
<el-progress type="dashboard" :percentage="20" :gapPercentage="0"></el-progress>
<el-progress type="dashboard" :percentage="20" :gapPercentage="50"></el-progress>
<el-progress type="dashboard" :percentage="20" :gapPercentage="75"></el-progress>
运行结果如下:
仪表盘缺口位置
组件新增属性gapPosition
,用于设置仪表盘进度条缺口位置,支持top
、bottom
、left
、 right
选型。默认情况下为 bottom
。
gapPosition: {
type: String,
validator: val => ['top', 'bottom', 'left', 'right'].indexOf(val) > -1
}
缺口的位置实际上等同于路径绘制开始的位置,默认情况下圆形是top
,仪表盘是bottom
。 所以新增计算属性gapPos
返回路径开始绘制位置。
gapPos() {
return this.gapPosition || (this.type === 'dashboard' && 'bottom') || 'top';
},
更新计算按属性trackPath
逻辑,默认声明 top
位置下的起始点(beginPositionX,beginPositionY)
结束点(endPositionX,endPositionY)
,都是相对坐标。
然后根据不同位置,调整点位数值。
- 位置
top
bottom
为y
轴方向,点位的 x 坐标为 0。 - 位置
left
,right
为x
轴方向,点位的 y 坐标为 0。
最后生成路径创建指令。
trackPath() {
const radius = this.radius;
// top
let beginPositionX = 0;
let beginPositionY = -radius;
let endPositionX = 0;
let endPositionY = -2 * radius;
switch (this.gapPos) {
case 'left':
beginPositionX = -radius;
beginPositionY = 0;
endPositionX = 2 * radius;
endPositionY = 0;
break;
case 'right':
beginPositionX = radius;
beginPositionY = 0;
endPositionX = -2 * radius;
endPositionY = 0;
break;
case 'bottom':
beginPositionY = radius;
endPositionY = 2 * radius;
break;
default:
}
return `
M 50 50
m ${beginPositionX},${beginPositionY}
a ${radius} ${radius} 0 1 1 ${endPositionX},${-endPositionY}
a ${radius} ${radius} 0 1 1 ${-endPositionX},${endPositionY}
`;
},
组件代码示例:
<el-progress type="dashboard" :percentage="20"></el-progress>
<el-progress type="dashboard" :percentage="20" :gapPosition="'top'"></el-progress>
<el-progress type="dashboard" :percentage="20" :gapPosition="'left'"></el-progress>
<el-progress type="dashboard" :percentage="20" :gapPosition="'right'"></el-progress>
运行结果如下:
当然也可使用这个属性改变圆环的起始位置,将上述代码类型改为circle
,效果如下。
在线代码
组件最终代码 progress_new_features gist
关注专栏
此文章已收录到专栏中