如图所示:

画布组件:dashboard.vue

<template>
<div>
<canvas ref="canvas" v-if="change" id="canvas" width="600" height="400" style="width: 300px;height: 200px;"></canvas>
</div>
</template> <script>
export default {
data() {
return {
change: true,
text:['信用极差','信用较差','信用良好','信用极好']
};
},
props: ['score'],
methods: {
canvasScore(id, getScore) {
const vm = this;
if(this.common.basics.isNull(getScore)){
getScore = 999
}
let fillText=vm.text[Math.floor(getScore/250)];
if(this.common.basics.isNull(fillText)){
fillText = vm.text[3];
} new init(this.$refs.canvas, {
teamNum: 20,
radius: 10 / 2,
fullMarks:1000,
grade:getScore,
color:'#44AAC9',
fillColor:'#ffffff',
function:function(ctx,options){
ctx.font = '500 72px microsoft yahei';
ctx.textAlign = 'center';
ctx.fillStyle = '#ffffff';
ctx.fillText(options.grade, options.circle_x, options.circle_y-20);
ctx.font = '500 40px microsoft yahei';
ctx.textAlign = 'center';
ctx.fillStyle = '#ffffff';
ctx.fillText(fillText, options.circle_x, options.circle_y+45);
}
}) }
},
mounted() {
this.canvasScore('canvas', this.score);
},
watch: {
'score'() {
this.change = false;
this.$nextTick(() => {
this.change = true;
this.$nextTick(() => {
this.canvasScore('canvas', this.score);
});
});
}
}
}; /**
* @desc:canvas绘画芝麻分仪表盘
* @param:canvas canvas自身
* @param:options options配置
* @param:options-width canvas宽度
* @param:options-height canvas高度
* @param:options-teamNum 小圆的个数
* @param:options-radius 小圆的直径
* @param:options-designChartWidth //设计图宽度 默认750
* @param:options-fillColor //小圆达到指标后的填充颜色
* @param:options-color //小圆的默认颜色
* @param:options-fontSzie //字体大小
* @param:options-fontColor //字体颜色
* @param:options-fullMarks//总分数
* @param:options-grade//目标分数
* @param:options-function//其他操作 函数 接受ctx-canvas 2d options-配置
*/
function init(canvas, options) {
if (!options) {
options = {};
}
var cxt = canvas.getContext('2d');
var clientWidth = document.documentElement.clientWidth;//根据设计图中的canvas画布的占比进行设置
options.width = 371;//canvas的宽
options.height = 270;//canvas的高
var canvasWidth = Math.floor(clientWidth * options.width / (options.designChartWidth ? options.designChartWidth : 750));
var canvasHeight = Math.floor(clientWidth * options.height / (options.designChartWidth ? options.designChartWidth : 750));
canvas.setAttribute('width', canvasWidth*this.getDevicePixelRatio());
canvas.setAttribute('height', canvasHeight*this.getDevicePixelRatio());
canvas.style.width = canvasWidth+'px';
canvas.style.height = canvasHeight+'px';
options.radius = options.radius || 50 / 10;//小圆的直径
options.radius = options.radius*this.getDevicePixelRatio()
options.team_num = options.teamNum || 10;//小圆的个数
options.circle_r = canvas.getAttribute('width') / 2 - options.radius; // 半径
options.circle_x = 0 + options.circle_r + options.radius; // 圆心坐标x
options.circle_y = 0 + options.circle_r + options.radius;//圆心坐标y
this.loadTeams(cxt, options);
}
init.prototype = {
loadTeams(cxt, options) {//加载布局模拟图
this.font(cxt, options);
this.seating(cxt, options);
},
font(cxt, options) {//加载图中文案
if(options.function){
options.function(cxt, options);
}
},
seating(cxt, options) { //分配小圆座次
var angle = 230 / options.teamNum; //角度
var a = options.fullMarks/options.teamNum;//计算每个小圆代表的值
var team_x = 0, team_y = 0;
var team_r = options.radius; // options.team_num < 20 ? 10 : Math.sqrt(options.circle_r * options.circle_r * 2 * (1 - Math.cos(changeRadian(angle)))) / 2;
//余弦定理 计算小圆的最大半径 BC2=AB2+AC2-2×AB×AC×cosα 如果小圆数目小于20个,半径最大30(上限)
for (var i = 0; i < options.teamNum; i++) {
team_x = options.circle_x + Math.sin(this.changeRadian((i * angle) + 250.9)) * options.circle_r; //角度转弧度
team_y = options.circle_y - Math.cos(this.changeRadian((i * angle) + 250.9)) * options.circle_r;
cxt.beginPath();
cxt.arc(team_x, team_y, team_r, 0, 2 * Math.PI);
if((i+1)*a<=options.grade)cxt.fillStyle = options.fillColor ? options.fillColor : 'red';
else cxt.fillStyle = options.color ? options.color : '#333333';
cxt.fill();
}
},
changeRadian(angle) { //角度转换为弧度
return Math.PI / 180 * angle;
},
getDevicePixelRatio (){//避免手机端失帧
return window.devicePixelRatio || 1;
}
}
</script> <style scoped> </style>

父组件引用画布组件

      <dashboard class="sizeQuery" :score="this.scoreVal"></dashboard>
scoreVal为分数值,从后台获取可得,从而传给画布组件。

此文为原创,不可转发。

vue 使用canvas仿芝麻分信用表的更多相关文章

  1. canvas仿芝麻信用分仪表盘

    这是一个仿支付宝芝麻信用分的一个canvas,其实就是一个动画仪表盘. 首先, 上原图: 这个是在下支付宝上的截图,分低各位见笑了.然后看下我用canvas实现的效果图: <canvas id= ...

  2. 使用Vue.js制作仿Metronic高级表格(一)静态设计

    Metronic高级表格是Metonic框架中自行实现的表格,其底层是Datatables.本教程将主要使用Vue实现交互部分,使用Bootstrap做样式库.jQuery做部分用户交互(弹窗). 使 ...

  3. Canvas 仿百度贴吧客户端 loading 小球

    前言 几天前在简书上看到在一篇文章<Android仿百度贴吧客户端Loading小球>,看了一下作者,他写了两个好玩的 demo,效果图如下: 今天趁着周末有空,用 H5 的 Canvas ...

  4. vue + element 动态渲染、移除表单并添加验证

    博客地址:https://ainyi.com/66 又接到新需求了吧~~ 背景 在一个大表单里,有可能会出现这种需求,用户可以自己操作动态添加.移除表单,更加个性化的效果. 常见于填写个人信息.附加内 ...

  5. java-js知识库之一——canvas绘制9*9乘法表

    不知不觉一年又要过去了,软件这一行入坑快两年了,一直不知道这两年干了些啥,也不知道自己到底会些什么,工作也是些简单的东西,谁都能做,对未来也是很茫然.今天和同事优化数据库,头都是懵的,很多东西都感觉似 ...

  6. vue同一页面中拥有两个表单时,验证问题

    问题:如果vue的同一个页面拥有两个表单.验证第一个表单时没有通过就切换到第二个,那么第二个表单会出现验证错误的信息 我们可以通过为两个表单添加ref属性 之后在通过调用resetFields()方法 ...

  7. 一起学Hive——创建内部表、外部表、分区表和分桶表及导入数据

    Hive本身并不存储数据,而是将数据存储在Hadoop的HDFS中,表名对应HDFS中的目录/文件.根据数据的不同存储方式,将Hive表分为外部表.内部表.分区表和分桶表四种数据模型.每种数据模型各有 ...

  8. hive中的分桶表

    桶表也是一种用于优化查询而设计的表类型.创建通表时,指定桶的个数.分桶的依据字段,hive就可以自动将数据分桶存储.查询时只需要遍历一个桶里的数据,或者遍历部分桶,这样就提高了查询效率 ------创 ...

  9. hive 分区表和分桶表

    1.创建分区表 hive> create table weather_list(year int,data int) partitioned by (createtime string,area ...

随机推荐

  1. go报错unimplemented: 64-bit mode not compiled in与mingw 64位安装报错ERROR res已解决

    问题一:cc1.exe: sorry, unimplemented: 64-bit mode not compiled in 参考:https://www.cnblogs.com/lesroad/p/ ...

  2. C# [Win32] [API] Layered Windows

    static void* WndProc(void* hwnd, uint uMsg, void* wParam, void* lParam) { switch (uMsg) { case WM_PA ...

  3. DNS区域传送、子域授权

    前言 DNS服务器搭建参考上一篇: DNS主从复制,就是将主DNS服务器的解析库复制传送至从DNS服务器,进而从服务器就可以进行正向.反向解析了.从服务器向主服务器更新查询数据,保证数据一致性,此为区 ...

  4. csla框架__使用Factory方式实现Csla.BusinessBase对象数据处理

    环境:.net4.6+csla4.6 实现:对象的数据库访问及数据库执行使用Factory方式进行封闭. 正文: 以前在使用csla框架完成业务对象的定义时所有的数据处理都在对象内部实现,也不能说不好 ...

  5. 安装SQl Server 报错 "需要 Microsoft.NET Framework 3.5 ServicePack 1" 解决方法

    前言 之前装Sql Server都没遇到过这样的问题, 昨天重装了系统之后, 然后安装SQl Server 报错,提示 "需要 Microsoft.NET Framework 3.5 Ser ...

  6. sass学习笔记(一)接上个 持续学习中..(还发现个讲解的bug) sass至少我现在学的版本支持局部变量了

    6.全局变量 sass暂时没有局部变量 局部定义变量会覆盖全局变量 新出!global 不过要sass 3.4版本以后        (这句呢,,我觉得是错的 开始写的时候没测试 现在发现我觉得他是有 ...

  7. kali linux 配置嵌入式开发环境

    kali linux 2018.2 x64 一.支持i386库 如果你是64位的Kali Linux系统,用如下命令添加i386架构支持到你的开发环境. dpkg --add-architecture ...

  8. jsp视频如何播放

    网站开发小白们对如何插入视频有较大的困扰,一段时间不知道从何下手,想在数据库里面直接导入,但没能成功,后又尝试直接在myeclipse里面直接放入视频. 对于不同的播放器,视频的格式也有要求,建议使用 ...

  9. Unity3D Button组管理(给按钮的onclick事件“传递参数”)

    using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI; // ...

  10. APICloud-数据存储

    APICloud 共有四种数据存储 1.file:目录操作,文件操作 文件存储方式,用于图片.文档的上传.下载.删除.管理. 2.db:本地 sqlite 数据库 用于离散数据的存储. 3.loacl ...