用 u-charts 实现最稳,因其专为 uni-app 设计,兼容全端尤其是小程序,已封装 canvas 初始化、resize 响应及 touch 映射,避免 echarts 在小程序中因 dom 依赖导致的 canvas 报错、白屏等问题。

直接用 u-charts 实现最稳,比原生 ECharts 在 uni-app 全端(尤其是小程序)兼容性更好,且自带吸顶、点击高亮、数据标签等支付宝式交互细节。
为什么不用 ECharts 直接 init?
ECharts 在 H5 和 App 端表现尚可,但在微信/支付宝/抖音等小程序里容易报 canvas is not defined 或渲染空白——因为这些平台不支持 DOM 操作,而官方 Vue 封装版(@vue/echarts)依赖浏览器环境。uni-app 的 canvas-id 机制和小程序 canvas 生命周期也和 ECharts 原生初始化逻辑冲突,调试成本高。
- 常见错误现象:
Cannot read property 'getWidth' of null、图表不显示但控制台无报错、iOS 小程序白屏 - 即使强行 hack(如用
uni.createCanvasContext+ 手动桥接),不同端 canvas 尺寸计算逻辑不一致,pixelRatio处理极易出错 -
u-charts是专为 uni-app 设计的轻量级 canvas 图表库,内部已封装好各端 canvas 初始化、resize 响应、touch 坐标映射
如何用 u-charts 快速画出「财富报表」风格饼图?
核心是配置 type="pie" + 启用 dataLabel + 自定义颜色 + 点击 tooltip 样式,再配合 uni-app 的 sticky 容器实现类似支付宝账单页的月份吸顶+饼图联动。
- 安装插件:HBuilderX → 插件市场 → 搜索「u-charts」→ 安装(无需 npm,避免版本兼容问题)
- 模板中直接使用组件:
<qiun-data-charts type="pie" :opts="pieOpts" :chartdata="pieData"></qiun-data-charts> -
pieData结构必须是:{ series: [{ name: "活期", data: 42.5 }, { name: "余额宝", data: 38.2 }, { name: "基金", data: 19.3 }] }—— 注意字段名固定为name和data,不能写成value -
pieOpts关键配置:color: ["#4facfe", "#00f2fe", "#a6c1ee"], dataLabel: true, legend: { show: true, position: "bottom", float: "center" }, extra: { pie: { offsetAngle: -90, // 起始角度设为顶部(支付宝风格) activeRadius: 8, // 点击扇形时向外偏移半径 activeOpacity: 0.8 } }
怎么让饼图和月份列表联动滚动吸顶?
支付宝财富页的「月度汇总」标题吸顶,下面饼图随内容滚动——这不是图表本身的功能,而是 uni-app 页面布局与 position: sticky 的配合。
- 结构上把月份标题和饼图放在同一
<view class="month-section"></view>容器内,该容器设style="position: -webkit-sticky; position: sticky; top: 0; z-index: 10;" - 确保父容器有明确高度(如
height: calc(100vh - 100rpx)),否则 sticky 失效 - 避免在
<scroll-view></scroll-view>内使用 sticky,它只对普通<view></view>生效;若必须用 scroll-view,请改用onScroll手动监听scrollTop控制标题显隐 - 饼图数据更新后,调用
this.$forceUpdate()触发重新渲染(u-charts不响应chartData深层变化)
真正麻烦的不是画饼图,而是让不同端的 canvas 尺寸自适应、点击坐标精准映射、以及和滚动吸顶行为共存——这些细节 u-charts 已经处理了大半,但 sticky 容器的层级和高度约束稍不留神就会失效,建议用真机反复验证 iOS 和安卓小程序。










