uniapp vue3微信小程序echarts 组件封装

在上一篇的基础上,将图表封装成了组件,技术有限,大家凑合着看吧

<template>

<view class="chart-container">

<canvas id="myChart" type="2d" canvas-id="myChart" style="width: 100%; height: 400px;"></canvas>

</view>

</template>

<script setup>

import {

onMounted,

nextTick,

getCurrentInstance,

onUnmounted,

onBeforeUnmount

} from 'vue'

import * as echarts from 'echarts'

let chartInstance = null

const proxy = getCurrentInstance().proxy

const loopInit = () => {

nextTick(() => {

const query = uni.createSelectorQuery().in(proxy)

query.select('#myChart')

.fields({

node: true,

size: true

})

.exec(res => {

// 先判断节点是否获取成功,避免空指针报错

if (!res || !res0) return

const canvas = res0.node

canvas.addEventListener = () => {}

canvas.removeEventListener = () => {}

// 如果后续还遇到类似preventDefault的报错,也可以同步补全

canvas.preventDefault = () => {}

// 从selectorQuery结果中拿到容器的实际宽高

const {

width,

height

} = res0

// 传入小程序环境必需的初始化配置

const chartInstance = echarts.init(canvas, null, {

width: width,

height: height,

devicePixelRatio: uni.getSystemInfoSync().pixelRatio,

useDirtyRect: false, // 小程序环境关闭脏矩形优化,避免兼容问题

useCoarsePointer: true, // 适配移动端触摸交互

pointerSize: 40 // 适配触摸点击的热区大小

})

const option = {

tooltip: {

trigger: 'axis'

},

grid: {

top: '10%',

left: '3%',

right: '4%',

bottom: '20%',

containLabel: true

},

xAxis: {

type: 'category',

data: props.xData

},

yAxis: {

type: 'value'

},

legend: {

data: props.seriesList

},

series: props.seriesList.map(item => ({

name: item.name,

type: 'line', // 线性折线

data: item.data,

smooth: false, // 标准直线,true为平滑曲线

// 区域填充可选

// areaStyle: { opacity: 0.15 }

}))

}

// chartInstance.setOption(option)

/* const option = {

title: { text: '示例图表' },

tooltip: {},

xAxis: { data: 'A', 'B', 'C', 'D', 'E' },

yAxis: {},

series: [{

name: '销量',

type: 'bar',

data: 10, 20, 30, 40, 50

}]

}*/

chartInstance.setOption(option)

})

})

}

const props = defineProps({

xData: {

type: Array,

default: () => \[\]

},

seriesList: {

type: Array,

default: () => \[\]

},

legendlist: {

type: Array,

default: () => \[\]

}

})

onMounted(() => {

nextTick(() => {

// 延迟400ms再启动循环,给组件canvas渲染时间

setTimeout(loopInit, 400)

})

})

</script>

相关推荐
宝桥南山19 小时前
Microsoft Fabric - 简单尝试一下Microsoft Fabric .NET SDK
microsoft·微软·.net·.netcore·powerbi·fabric
hqyjzsb19 小时前
规划工商管理大学成长:搭建四层能力体系,重视高阶的 AI 能力建设
开发语言·人工智能·python·microsoft·职场和发展·数据挖掘·业界资讯
ai_finder2 天前
买卖点预警系统是怎么工作的?从自然语言到盯盘任务的一次工程拆解
人工智能·科技·microsoft·金融
m0_466525293 天前
从火柴人看护画面看云从科技生态企业的隐私保护实践
大数据·人工智能·科技·microsoft
大模型码小白3 天前
告别造假数据,直接连数据库查真实时序数据喂给 TimechoAI 大模型
java·数据库·人工智能·microsoft·架构
海盗12343 天前
微软技术日报 2026-09-14:Rust 升为微软一级语言,云业务重组为智能体与基础设施
开发语言·microsoft·rust
ManageEngineITSM3 天前
什么是IT服务连续性管理?灾难恢复与业务连续性一文讲清
数据库·microsoft·工单系统·变更管理
秦哈哈4 天前
【Hello Agents】学习笔记(二)
笔记·学习·microsoft
承渊政道4 天前
Python IDLE鸿蒙PC适配全记录:用 ArkUI 重建编辑、运行、Shell 与基础调试闭环
python·microsoft·harmonyos·鸿蒙系统·pc端
啾啾Fun4 天前
【AI Coding】5-Pi Agent Harness:一个极简终端编码Harness的解构
人工智能·microsoft·ai agent·claude code·ai coding