【uniapp】中 微信小程序实现echarts图表组件的封装

 插件地址:echarts-for-uniapp - DCloud 插件市场

图例:

一、uniapp 安装 

npm i uniapp-echarts --save

 二、文件夹操作

将 node_modules 下的 uniapp-echarts 文件夹复制到 components 文件夹下

 当前不操作此步骤的话,运行 -> 运行到小程序模拟器 -> 微信开发者工具 时,echarts图表显示不出来

原因:运行到小程序打包过程中,此插件不在小程序文件包内

三、地址引入

根据当前插件放的地址进行引入

import * as echarts from "@/components/uniapp-echarts/static/echarts.min.js";
import uniChart from "@/components/uniapp-echarts/components/uni-chart/uni-chart.vue"; 

四、组件封装 echartLine.vue

<template>
  <view class="content">
    <uniChart :option="person.option" />
  </view>
</template>

<script setup>
import { reactive, shallowRef, onMounted } from 'vue'
import * as echarts from "@/components/uniapp-echarts/static/echarts.min.js";
import uniChart from "@/components/uniapp-echarts/components/uni-chart/uni-chart.vue"; 

const props = defineProps({
    id: {
        type: String,
        required: true
    },
    datas:{
        type: Array,
        required: true
    }
})
let person=reactive({
	userScore:[],
	userAvgScore:[], 
	xTime:[], // x轴数据
	max: 600, // 最大数值
    option: {}
})

onMounted(()=>{
    load()
    GetEchar()
})
const load=()=>{
    // 指定配置项和数据
    person.userScore = props.datas.map(f => { return f.score })
    person.userAvgScore = props.datas.map(f => { return f.avgScore })
    person.xTime = props.datas.map(f => { return f.name })
}

const GetEchar = () => {
	person.option = {
	  tooltip: {
		trigger: 'axis',
		formatter: function (params) {
		  return params[0].name+'\n'
		  +option.legend.data[0].name+':'+person.userScore[params[0].dataIndex]+'分\n'
		  +option.legend.data[1].name+':'+person.userAvgScore[params[0].dataIndex]+'分'
		}
	  },
	  legend: {
		data: [
		  { name: '学生/张小雨', icon: 'circle' },
		  { name: '年级平均', icon: 'circle' }
		],
		icon: 'circle',
		y: 'bottom',
		itemWidth: 12, //宽度
		itemHeight: 12, //高度
		itemGap: 25, //间距
		textStyle: {
		  color: '#333',
		  fontSize: 12,
		  lineHight: 40
		}
	  },
	  grid: {
		top: '3%',
		left: '3%',
		right: '5%',
		bottom: '12%',
		containLabel: true
	  },
	  xAxis: [
		{
		  type: 'category',
		  axisTick: {
			show:false
		  },
		  axisLine: {
			onZero: false,
			lineStyle: {
			  color: '#2A2A2A',
			  width: 2
			}
		  },
		  axisLabel: {
			//坐标轴刻度标签的相关设置。
			textStyle: {
			  color: '#6F6F70',
			  fontSize: 12
			},
			formatter: function (params) {
			  return params;
			}
		  },
		  data: person.xTime
		}
	  ],
	  yAxis: [
		{
		  type: 'value',
		  axisTick: {
			show:false
		  },
		  axisLine: {
			show:false
		  },
		  max: person.max,
		  min: 0,
		  // y轴文字颜色
		  axisLabel: {
			textStyle: {
			  color: '#6F6F70',
			  fontSize: 12
			}
		  },
		  splitLine: {
			show: true,
			lineStyle: {
			  color: ['#5E5E5E'],
			  width: 1,
			  type: 'dashed'
			}
		  }
		}
	  ],
	  series: [
		{
		  name: '学生/张小雨',
		  type: 'line',
		  symbol: 'circle', //拐点样式
		  symbolSize: 4, //拐点大小
		  // 折线拐点的样式
		  itemStyle: {
			normal: {
			  // 静止时:
			  color: '#6B86FF',
			  borderColor: '#6B86FF', //拐点的边框颜色
			  borderWidth: 2
			},
			emphasis: {
			  // 鼠标经过时:
			  color: '#fff'
			}
		  },
		  data: person.userScore
		},
		{
		  name: '年级平均',
		  type: 'line',
		  symbol: 'circle', //拐点样式
		  symbolSize: 4, //拐点大小
		  // 折线拐点的样式
		  itemStyle: {
			normal: {
			  // 静止时:
			  color: '#FFA755',
			  borderColor: '#FFA755', //拐点的边框颜色
			  borderWidth: 2
			},
			emphasis: {
			  // 鼠标经过时:
			  color: '#fff'
			}
		  },
		  data: person.userAvgScore
		}
	  ]
	};
}
</script>
<style>
.content {
    width: 375px;
    height: 250px;
}
</style>

五、页面调用

<EchartLine v-if="person.studentScore && person.studentScore.length > 0" :id="'studentGrade'" :datas="person.studentScore" />

<script setup>
import { reactive } from 'vue'
import EchartLine from "@/components/echarts/echartLine.vue"

let person=reactive({
	// 学生总成绩
	studentScore:[
		{name:'7月5日',score:10,avgScore:90},
		{name:'7月6日',score:93,avgScore:80},
		{name:'7月7日',score:60,avgScore:70},
		{name:'7月8日',score:50,avgScore:70},
		{name:'7月9日',score:86,avgScore:50}
	]
})
</script>

六、避坑

1、解决echarts层级太高 

在手机端运行时,出现 echarts层级太高,导致滑动到图表上时,滑不动的情况

解决方法:

在复制的 uniapp-echarts 文件夹包下,找到 components -> uni-chart  ->  uni-chart.vue 文件,添加 scroll-view 将 canvas 标签包裹一层,其中 canvas 要有@touchstart ,否则真机不生效。

如下代码

<!-- #ifdef MP-WEIXIN || MP-QQ -->
<scroll-view :scroll-top="scrollTop" scroll-y="true" class="scroll-Y"
	@scrolltoupper="upper" @scrolltolower="lower" @scroll="scroll">
	<canvas
		v-if="useNewCanvas"
		type="2d"
		:id="canvasId"
		class="uni-canvas"
		:canvas-id="canvasId"
		@click="click"
		@touchstart="touchStart"
		@touchmove.stop="touchMove"
		@touchend="touchEnd"
		force-use-old-canvas="true"
	/>
	<canvas
		v-else
		:id="canvasId"
		class="uni-canvas"
		:canvas-id="canvasId"
		@click="click"
		@touchstart="touchStart"
		@touchmove.stop="touchMove"
		@touchend="touchEnd"
		force-use-old-canvas="true"
	/>
</scroll-view>
<!-- #endif -->

同时需要修改样式

<style>
.scroll-Y{
	height: 100%;
	position: relative;
	left: 50%;
	transform: translate(-50%);
}
.uni-canvas {
	width: 100%;
	height: 100%;
	display: block;
	z-index: -1 !important;
}
</style>

    希望我的愚见能够帮助你哦~,若有不足之处,还望指出,你们有更好的解决方法,欢迎大家在评论区下方留言支持,大家一起相互学习参考呀~

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
uni-app开发微信小程序引入echarts并导入动态数据的方法如下: 1. 首先,确保你已经下载了EchartsForWx插件\[2\]。可以在微信小程序的插件管理搜索并下载该插件。 2. 在uni-app项目的static目录下创建一个echarts文件夹,并将下载的EchartsForWx插件解压到该文件夹。 3. 在需要使用echarts的页面,引入echarts的核心文件。可以在页面的script标签使用require语法引入echarts文件,例如: ``` const echarts = require('../../static/echarts/echarts.js'); ``` 4. 在页面的data定义一个变量,用于存储动态数据,例如: ``` data() { return { chartData: \[\] } } ``` 5. 在页面的onLoad生命周期函数,获取动态数据并将其赋值给chartData变量,例如: ``` onLoad() { // 获取动态数据的逻辑 // 将数据赋值给chartData变量 this.chartData = dynamicData; } ``` 6. 在页面的onReady生命周期函数,使用echarts绘制图表。可以在canvas的id属性指定一个唯一的标识符,然后在onReady函数使用该标识符获取canvas的上下文,并使用echarts的API绘制图表,例如: ``` onReady() { const chart = echarts.init(this.$refs.chart); // 获取canvas的上下文 const option = { // echarts的配置项 series: \[{ type: 'bar', data: this.chartData }\] }; chart.setOption(option); // 绘制图表 } ``` 7. 在页面的template,使用canvas标签创建一个画布,并设置一个唯一的id属性,例如: ``` <canvas id="chart" ref="chart"></canvas> ``` 通过以上步骤,你就可以在uni-app开发的微信小程序引入echarts,并导入动态数据来绘制图表了。记得根据你的实际需求修改echarts的配置项和数据。 #### 引用[.reference_title] - *1* [uniapp - 微信小程序端引入 Echarts 图表及使用详细教程,简单快速的解决方案(拒绝复杂的过程,附带详细的...](https://blog.csdn.net/weixin_50545213/article/details/130131596)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [UNIAPP微信小程序使用Echarts](https://blog.csdn.net/qq_35921773/article/details/127536926)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值