序:
产品:客户说他们晚上也想看数据,但是不想开电脑,所以我想把我们的数据平台搬上小程序端。
开发:😳也可以用h5啊,我们的数据平台没用到小程序端的功能,不用弄上小程序吧。
产品:可是客户说他们不想每次都输入网址。
开发:那可以加个书签呀。
产品:可客户说他们就喜欢小程序,就想在小程序上看,所以还是弄小程序吧。
开发:😩嗯。。。好的
所以,需求来了,我们需要在小程序端展示数据图表,由于我们原先的数据平台用的就是echarts,所以可视化图表库优先选择echarts,我们之前的小程序端技术栈用的uniapp,所以uniapp结合echarts的技术栈就来了。
做过或了解数据图表的同学应该都接触过百度的echarts库;echarts一个基于 JavaScript 的开源可视化图表库,常用于web端的数据图表展示,也可以用于其他平台;这篇文章的目的就是分享怎么在uniapp框架下小程序环境中使用echarts。
安装:
这次分享我们就不从构建项目开始了,需要了解怎么构建uniapp项目的同学可以自己去官网查看(传说门);注意⚠️ 我们这次分享的项目是基于Vue3/Vite/Ts构建的。
// npm
npm install echarts
// yarn
yarn add echarts
coding:
先创建文件,然后写好最基础的内容:
<template>
<canvas type="2d" :canvas-id="state.canvasId" :id="state.canvasId" />
</template>
<script setup lang="ts">
const state = reactive({
canvasId: "canvasId",
});
</script>
现在我们的页面中已经有canvas元素了,接下来的就是重点了;在小程序中是不能直接使用document获取元素的,那我们该怎么将echart初始化到我们的canvas元素中呢?
答案就是 setPlatformAPI
我们在echarts的API文档中可以找到setPlatformAPI,可以看到对它的描述是 设置平台相关的 API,在 NodeJS 等非浏览器平台的时候可能需要提供;里面有个createCanvas方法是用于告诉echarts该怎么处理我们的canvas。
导入echarts,并调用setPlatformAPI
import * as echarts from "echarts"
echarts.setPlatformAPI({
createCanvas() {
//uniapp创建离屏 canvas 实例
return uni['createOffscreenCanvas']({ type: "2d" });
},
})
现在可以准备使用echart的init方法了,但是又有个问题,我们之前使用setPlatformAPI是告诉echarts怎么处理canvas;但echart的init方法需要传入一个节点我们又该怎么处理呢?既然不知道怎么处理,那先传个空对象,毕竟js的世界里所有的一切都是对象嘛🤣
echarts.init({})
然后我们就能看到控制台报了 this.dom.getContext is not a function 错误,那我们知道了,缺了个getContext方法;getContext方法顾名思义就是获取dom的上下文的方法,我们需要返回一个canvas的上下文,怎么获取呢?uniapp中有createSelectorQuery方法:
import {getCurrentInstance} from "vue"
const instance = getCurrentInstance();//vue3 setup用getCurrentInstance方法获取,vue2之间传入this
//获取canvas节点
const getNode = ()=>{
return new Promise((resolve, reject) => {
const dom = uni.createSelectorQuery().in(instance).select(state.canvasId);
return dom['fields'](
{
node: true,
size: true,
rect: true,
},
(rect)=>{
if(rect){
resolve(rect);
}else{
reject();
}
}
).exec();
})
}
//获取canvas的context
const { node } = getNode();
//这个就是canvas的context
const ctx = node.getContext("2d");
现在我们已经拿到canvas的context了,将它给getContext方法返回即可。
然后我们接着看控制台,报错信息已经从this.dom.getContext is not a function 变成了el.addEventListener is not a function,addEventListener方法就不用多说了,事件监听器;由于我们先不添加事件处理方法,所以直接先给个空的箭头函数,保存后再看看控制台,发现已经没有错误了;可以往下继续走,我们使用echarts的setOption方法配置图表信息:
charts.setOption({
tooltip: {
trigger: "item",
},
legend: {
top: "5%",
left: "center",
},
series: [
{
name: "Access From",
type: "pie",
radius: ["40%", "70%"],
avoidLabelOverlap: false,
label: {
show: false,
position: "center",
},
emphasis: {
label: {
show: true,
fontSize: 40,
fontWeight: "bold",
},
},
labelLine: {
show: false,
},
data: [
{ value: 1048, name: "Search Engine" },
{ value: 735, name: "Direct" },
{ value: 580, name: "Email" },
{ value: 484, name: "Union Ads" },
{ value: 300, name: "Video Ads" },
],
},
],
});
注意: charts是由echarts.init方法返回的值,这个使用是按照echart文档中来的
现在再看看页面,我们已经可以看到页面中已经有图表的图案了,但是图案的大小有点不对,我们可以在init传入的对象中给到width及height给予宽高就会正常了。
写到这里我们的uniapp怎么使用echarts显示图表就已经基本讲完了,至于后面的事件处理及图片下载、图表全屏等功能下次再聊🥱