• ucharts最详细教程(含踩坑记录)


    ucharts介绍

    uCharts是一款基于canvas API开发的适用于所有前端应用的图表库,开发者编写一套代码,可运行到 Web、iOS、Android(基于 uni-app / taro )、以及各种小程序(微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝/京东/360)、快应用等更多支持 canvas API 的平台。

    使用

    • 由于本人正在开发uniapp应用涉及到了图表,便查阅到该图表库,觉得很易用便分享给大家

    官方文档:https://www.ucharts.cn/v2/#/document/index
    由于示例丰富,除非涉及到细节的东西可以查阅文档进行配置
    查看官网的示例,根据示例去复制代码即可
    在这里插入图片描述

    使用官方代码之前记得引入ucharts.
    这里推荐使用它的组件方式(简单易用)
    使用hbuildx导入插件即可,地址:https://ext.dcloud.net.cn/plugin?id=271

    这里我演示一下条形图如何使用吧

    首先保证引入了ucharts插件
    然后上官网条形图复制它的代码
    在这里插入图片描述
    template中:

    <view class="charts-box">
    		    <qiun-data-charts 
    		      type="bar"
    		      :opts="opts"
    		      :chartData="chartData"
    			  tooltipFormat="ypjcBar"
    		    />
    		  </view>
    

    js中

    <script>
    	export default {
    		data() {
    			return {
    				 chartData: {},
          //您可以通过修改 config-ucharts.js 文件中下标为 ['bar'] 的节点来配置全局默认参数,如都是默认参数,此处可以不传 opts 。实际应用过程中 opts 只需传入与全局默认参数中不一致的【某一个属性】即可实现同类型的图表显示不同的样式,达到页面简洁的需求。
    			  opts: {
    				color: ["#1890FF","#91CB74","#FAC858","#EE6666","#73C0DE","#3CA272","#FC8452","#9A60B4","#ea7ccc"],
    				padding: [15,30,0,5],
    				legend: {
    					"position":"top",
    					"float":"left",
    				},
    				xAxis: {
    				  boundaryGap: "justify",
    				  disableGrid: false,
    				  min: 0,
    				  axisLine: false,
    				  max: 70
    				},
    				yAxis: {},
    				extra: {
    				  bar: {
    					type: "stack",
    					width: 30,
    					meterBorde: 1,
    					meterFillColor: "#FFFFFF",
    					activeBgColor: "#000000",
    					activeBgOpacity: 0.08,
    					categoryGap: 2
    				  }
    				}
    			  },
    		},
    		computed: {},
    		mounted() {
    			this.getServerData();//渲染图表
    		},
    		methods: {
    			//图表渲染
    			getServerData() {
    			  //模拟从服务器获取数据时的延时
    			  setTimeout(() => {
    				//模拟服务器返回数据,如果数据格式和标准格式不同,需自行按下面的格式拼接
    				let res = {
    					categories: ["加工业","种植业","畜牧业"],
    					series: [
    					  {
    						name: "合格样品",
    						data: [35,36,31]
    					  },
    					  {
    						name: "不合格样品",
    						data: [18,27,21]
    					  },
    					  {
    						name: "待检测样品",
    						data: [18,27,21]
    					  },
    					]
    				  };
    				  console.log(res)
    				this.chartData = JSON.parse(JSON.stringify(res));
    				
    			  }, 1000);
    			},
    			
    		}
    
    	}
    </script>
    

    css中

    主要是设置图表大小

    .charts-box {
    	    width: 100%;
    	    height: 300px;
    	  }
    

    这样即可实现一个图表~
    对于图表中的配置可自行查看文档
    由于项目要求,需要自行实现一些修改

    实现自定义tooltip以及文本换行

    这个是使用ucharts最容易遇到的问题,需要修改它的文件
    找到config-ucharts,js文件
    formatter中自定义tooltip显示内容

    可以看到我上方使用了tooltipFormat="ypjcBar"
    这个属性是用于自定义tooltip的
    这里给的值是ypjcBar,所以需要在里边编写该函数

    这里主要是实现一个百分比计算显示在提示框上,至于我为何循环遍历,可自行打印函数中各个参数的值,通过匹对你会发现如何计算得到你想要实现的功能!!!

    //样品检测中的条形图
    	"ypjcBar":function(item,category,index,opts){
    		let sum=0;
    		for(let i=0;i<opts.series.length;i++){
    				sum+=opts.series[i].data[index]
    		}
    		return `${item.name}  ${item.data}   ${Number((item.data/sum)*100).toFixed(2)}% `
    	},
    

    这里献上截图方便你们知道编写代码的位置
    在这里插入图片描述
    这样我们就已经实现了自定义提示框了,效果图如下:
    在这里插入图片描述
    这里只是将百分比放在每项的后边,如果需要单独放一行呢,此时此刻就需要换行了,而ucharts不支持\n等实现换行,这时候又遇到一个需要深究的问题,这里分享给大家解决办法

    提示框上文本换行

    这里我另一个表用到了文本换行…
    写法与上方一致,只是修改了tooltipFormat="rykhBar"即可
    然后在config-ucharts,js文件中编写该函数

    //人员考核中的条形图
    	"rykhBar":function(item,category,index,opts){
    		let sum=0;
    		let areaName='';
    		for(let i=0;i<opts.series.length;i++){
    				sum+=opts.series[i].data[index]
    		}
    		return areaName+sum+`${item.name}  ${item.data}分`
    	},
    

    这样就导致内容在一行了。。。。
    在这里插入图片描述
    而我们要实现的效果是地区与总分单独显示一行
    现在我们只需要加个判断,由于知道每项有个固定值所以判断写死

    "rykhBar":function(item,category,index,opts){
    		let sum=0;
    		let areaName='';
    		for(let i=0;i<opts.series.length;i++){
    				sum+=opts.series[i].data[index]
    		}
    		if(item.name=='监管数据量平均分'){
    			sum=`总分平均分${sum}/`
    			areaName=`${opts.categories[index]}:`;
    		}else{
    			sum=''
    			areaName=''
    		}
    		return areaName+sum+`${item.name}  ${item.data}分`
    	},
    

    这样只显示在第一项前面了,还是没有达到换行效果,这里你是不是很好奇为什么加个/,方便后边截取换行~
    在这里插入图片描述
    这是判断后的效果图,现在去实现换行
    找到u-charts.js文件
    由于知道第一行的内容有总分平均分的字,所以判断写死并且通过/去截取
    找到drawToolTip函数,在里边加个判断

    if(textList[0].text.split("/")[0].indexOf("总分平均分")!==-1){
    			let newTextList={
    				"text":textList[0].text.split("/")[0]
    			}
    			textList[0].text=textList[0].text.split("/")[1]
    			textList.push(newTextList)
    			textList=textList.reverse();//数组反转
    	  }
    

    在这里插入图片描述

    • 然后通过截取将需要放在第一行的内容push到textList中,这样导致会在最后
    • 再通过reverse实现数组反转~
    • 这样就实现了o

    效果图:
    在这里插入图片描述
    大概最常见的问题就这些,如果有什么不懂的可以评论区问我✌

  • 相关阅读:
    STM32 Flash
    分布式系统中的领导选举
    Vue.js 构建可复用的组件
    【Ubuntu】解决The repository xxx no longer has a Release file
    单点故障解决方案之Smart Link与Monitor Link
    springboot 点滴(1)springboot IOC
    java毕业设计房产销售平台Mybatis+系统+数据库+调试部署
    【面试题】2022前端面试真题
    SCI 文章被拒是一种怎样的体验? - 易智编译EaseEditing
    每天3分钟,重学ES6-ES12(十五)异步代码处理方案
  • 原文地址:https://blog.csdn.net/m_xiaozhilei/article/details/126954830