499 lines
13 KiB
Markdown
499 lines
13 KiB
Markdown
|
|
# lime-echart 📊
|
|||
|
|
|
|||
|
|
为 UniApp 和 UniAppX 提供 ECharts 图表兼容支持,使 ECharts 图表能在 H5、小程序、App 等多端环境中正常运行。
|
|||
|
|
|
|||
|
|
## 特性 ✨
|
|||
|
|
|
|||
|
|
- 📱 **跨平台兼容**:支持 H5、微信小程序、支付宝小程序、App 等多端
|
|||
|
|
- 🎯 **简单易用**:统一 API,使用方式与原生 ECharts 基本一致
|
|||
|
|
- ⚡ **性能优化**:针对不同平台进行了渲染优化
|
|||
|
|
- 🔄 **双框架支持**:同时支持 uni-app 和 uni-app-x
|
|||
|
|
|
|||
|
|
## 文档与示例 📚
|
|||
|
|
|
|||
|
|
更多详细文档与示例:
|
|||
|
|
- [lime-echart 组件文档](https://limeui.qcoon.cn/#/echart)
|
|||
|
|
- [在线示例](https://limeui.qcoon.cn/#/echart-example)
|
|||
|
|
- [ECharts 官方示例](https://echarts.apache.org/examples/zh/index.html)
|
|||
|
|
- [lime-echart 组件文档2](https://limex.qcoon.cn/components/echart.html) (将来用到,目前未上线)
|
|||
|
|
|
|||
|
|
## 安装方法 📦
|
|||
|
|
|
|||
|
|
### 插件市场安装
|
|||
|
|
|
|||
|
|
1. 在uni-app插件市场中搜索并导入`lime-echart`
|
|||
|
|
2. 导入后重新编译项目
|
|||
|
|
3. 在页面中直接使用 `l-echart` 组件
|
|||
|
|
|
|||
|
|
### CLI 项目安装
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 下载插件到项目的 src/uni_modules 目录
|
|||
|
|
mkdir -p src/uni_modules
|
|||
|
|
# 将插件解压到上述目录
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 前置依赖 ⚙️
|
|||
|
|
|
|||
|
|
### 小程序平台(重点说明)
|
|||
|
|
|
|||
|
|
小程序平台必须下载并引入 ECharts 自定义构建包:
|
|||
|
|
|
|||
|
|
1. 小程序中引入ECharts方式:
|
|||
|
|
- **本地构建文件**
|
|||
|
|
- 访问 [ECharts 在线构建](https://echarts.apache.org/zh/builder.html) 下载所需图表类型的精简版
|
|||
|
|
- 注意:在线构建工具**仅支持生成UMD格式**(默认,`echarts.min.js`),通过 `require` 引入
|
|||
|
|
- 建议只勾选项目所需的图表类型和组件,以减小文件体积
|
|||
|
|
|
|||
|
|
2. **文件放置位置**:
|
|||
|
|
- 📁 **主包**:将文件放入项目根目录的 `static` 文件夹
|
|||
|
|
- 📁 **分包**:将文件放入对应分包的 `static` 文件夹(如 `pagesB/static/`)
|
|||
|
|
|
|||
|
|
3. **相对路径引用示例**:
|
|||
|
|
```js
|
|||
|
|
// UMD格式 - 页面位于主包根目录 - 相对路径引用示例(仅在线构建或本地文件使用)
|
|||
|
|
// ├─pages
|
|||
|
|
// │ └─index
|
|||
|
|
// │ └─index.vue
|
|||
|
|
// └─static
|
|||
|
|
const echarts = require('../../static/echarts.min.js')
|
|||
|
|
|
|||
|
|
// UMD格式 - 页面位于主包三层目录 - 相对路径引用示例(仅在线构建或本地文件使用)
|
|||
|
|
// ├─pages
|
|||
|
|
// │ └─user
|
|||
|
|
// │ └─settings
|
|||
|
|
// │ └─profile.vue
|
|||
|
|
// └─static
|
|||
|
|
const echarts = require('../../../static/echarts.min.js')
|
|||
|
|
|
|||
|
|
// UMD格式 - 页面位于分包中 - 相对路径引用示例(仅在线构建或本地文件使用)
|
|||
|
|
// ├─pagesB (分包)
|
|||
|
|
// │ ├─static
|
|||
|
|
// │ └─detail
|
|||
|
|
// │ └─detail.vue
|
|||
|
|
const echarts = require('../static/echarts.min.js')
|
|||
|
|
|
|||
|
|
// ES模块格式
|
|||
|
|
import * as echarts from 'echarts'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
> 注意:
|
|||
|
|
> - `require` 是小程序平台特有的API,仅在小程序环境下使用
|
|||
|
|
> - 路径是相对于当前页面文件的路径,请根据实际项目结构调整路径
|
|||
|
|
|
|||
|
|
|
|||
|
|
## 使用示例 🎯
|
|||
|
|
|
|||
|
|
### 图表配置项示例
|
|||
|
|
|
|||
|
|
以下是一个柱状图的配置项示例,在后续使用示例中将引用此配置:
|
|||
|
|
|
|||
|
|
```js
|
|||
|
|
// 图表配置项示例 - 柱状图
|
|||
|
|
const chartOption = {
|
|||
|
|
tooltip: {
|
|||
|
|
trigger: 'axis',
|
|||
|
|
axisPointer: {
|
|||
|
|
type: 'shadow'
|
|||
|
|
},
|
|||
|
|
confine: true
|
|||
|
|
},
|
|||
|
|
legend: {
|
|||
|
|
data: ['热度', '正面', '负面']
|
|||
|
|
},
|
|||
|
|
xAxis: [
|
|||
|
|
{
|
|||
|
|
type: 'value',
|
|||
|
|
axisLine: {
|
|||
|
|
lineStyle: {
|
|||
|
|
color: '#999999'
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
axisLabel: {
|
|||
|
|
color: '#666666'
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
yAxis: [
|
|||
|
|
{
|
|||
|
|
type: 'category',
|
|||
|
|
axisTick: { show: false },
|
|||
|
|
data: ['汽车之家', '今日头条', '百度贴吧', '一点资讯', '微信', '微博', '知乎'],
|
|||
|
|
axisLine: {
|
|||
|
|
lineStyle: {
|
|||
|
|
color: '#999999'
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
axisLabel: {
|
|||
|
|
color: '#666666'
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
series: [
|
|||
|
|
{
|
|||
|
|
name: '热度',
|
|||
|
|
type: 'bar',
|
|||
|
|
label: {
|
|||
|
|
show: true,
|
|||
|
|
position: 'inside'
|
|||
|
|
},
|
|||
|
|
data: [300, 270, 340, 344, 300, 320, 310]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: '正面',
|
|||
|
|
type: 'bar',
|
|||
|
|
stack: '总量',
|
|||
|
|
label: {
|
|||
|
|
show: true
|
|||
|
|
},
|
|||
|
|
data: [120, 102, 141, 174, 190, 250, 220]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: '负面',
|
|||
|
|
type: 'bar',
|
|||
|
|
stack: '总量',
|
|||
|
|
label: {
|
|||
|
|
show: true,
|
|||
|
|
position: 'left'
|
|||
|
|
},
|
|||
|
|
data: [-20, -32, -21, -34, -90, -130, -110]
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
> **说明**:在实际项目中,可以根据需求修改上述配置项。
|
|||
|
|
> - 更多配置选项请参考 [ECharts 官方文档](https://echarts.apache.org/zh/option.html)
|
|||
|
|
> - 查看更多图表样式请访问 [ECharts 官方示例](https://echarts.apache.org/examples/zh/index.html)
|
|||
|
|
|
|||
|
|
### uni-app 使用方式
|
|||
|
|
|
|||
|
|
#### 组合式 API 方式
|
|||
|
|
|
|||
|
|
```html
|
|||
|
|
<template>
|
|||
|
|
<view style="width: 750rpx; height: 750rpx;">
|
|||
|
|
<l-echart ref="chartRef" @finished="initChart"></l-echart>
|
|||
|
|
</view>
|
|||
|
|
</template>
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
```js
|
|||
|
|
import { ref } from 'vue';
|
|||
|
|
|
|||
|
|
const chartRef = ref(null)
|
|||
|
|
|
|||
|
|
// 仅在小程序环境下引入 ECharts
|
|||
|
|
// #ifdef MP
|
|||
|
|
const echarts = require('../../static/echarts.min.js') // 根据实际路径调整
|
|||
|
|
// #endif
|
|||
|
|
// #ifndef MP
|
|||
|
|
const echarts = null // H5 和 App 环境不需要手动引入
|
|||
|
|
// #endif
|
|||
|
|
|
|||
|
|
// 使用上面定义的图表配置项
|
|||
|
|
const option = chartOption
|
|||
|
|
|
|||
|
|
// 初始化图表
|
|||
|
|
const initChart = async () => {
|
|||
|
|
if (!chartRef.value) return
|
|||
|
|
|
|||
|
|
try {
|
|||
|
|
const chart = await chartRef.value.init(echarts)
|
|||
|
|
chart.setOption(option)
|
|||
|
|
} catch (error) {
|
|||
|
|
console.error('图表初始化失败:', error)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 选项式 API 方式
|
|||
|
|
|
|||
|
|
```html
|
|||
|
|
<template>
|
|||
|
|
<view style="width: 750rpx; height: 750rpx;">
|
|||
|
|
<l-echart ref="chartRef" @finished="initChart"></l-echart>
|
|||
|
|
</view>
|
|||
|
|
</template>
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
```js
|
|||
|
|
// 仅在小程序环境下引入 ECharts
|
|||
|
|
// #ifdef MP
|
|||
|
|
const echarts = require('../../static/echarts.min.js') // 根据实际路径调整
|
|||
|
|
// #endif
|
|||
|
|
// #ifndef MP
|
|||
|
|
const echarts = null // H5 和 App 环境不需要手动引入
|
|||
|
|
// #endif
|
|||
|
|
|
|||
|
|
export default {
|
|||
|
|
data() {
|
|||
|
|
return {
|
|||
|
|
// 使用上面定义的图表配置项
|
|||
|
|
option: chartOption,
|
|||
|
|
// 图表实例,用于后续操作
|
|||
|
|
chartInstance: null,
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
methods: {
|
|||
|
|
// 初始化图表
|
|||
|
|
async initChart() {
|
|||
|
|
if (!this.$refs.chartRef) return
|
|||
|
|
|
|||
|
|
try {
|
|||
|
|
this.chartInstance = await this.$refs.chartRef.init(echarts)
|
|||
|
|
this.chartInstance.setOption(this.option)
|
|||
|
|
} catch (error) {
|
|||
|
|
console.error('图表初始化失败:', error)
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
// 更新图表数据
|
|||
|
|
updateChart(newOption) {
|
|||
|
|
if (this.chartInstance) {
|
|||
|
|
this.chartInstance.setOption(newOption)
|
|||
|
|
} else if (this.$refs.chartRef) {
|
|||
|
|
this.$refs.chartRef.setOption(newOption)
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
// 调整图表大小
|
|||
|
|
resizeChart() {
|
|||
|
|
if (this.$refs.chartRef) {
|
|||
|
|
this.$refs.chartRef.resize()
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
// 页面卸载时销毁图表实例
|
|||
|
|
beforeUnmount() {
|
|||
|
|
if (this.$refs.chartRef) {
|
|||
|
|
this.$refs.chartRef.dispose()
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### uni-app-x 使用方式
|
|||
|
|
|
|||
|
|
```html
|
|||
|
|
<template>
|
|||
|
|
<view style="width: 100%; height: 408px;">
|
|||
|
|
<l-echart ref="chartRef" @finished="initChart"></l-echart>
|
|||
|
|
</view>
|
|||
|
|
</template>
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
```ts
|
|||
|
|
const chartRef = ref<LEchartComponentPublicInstance | null>(null)
|
|||
|
|
|
|||
|
|
// 仅在小程序环境下引入 ECharts
|
|||
|
|
// #ifdef MP
|
|||
|
|
const echarts = require('../../static/echarts.min.js') // 根据实际路径调整
|
|||
|
|
// #endif
|
|||
|
|
// #ifndef MP
|
|||
|
|
const echarts = null
|
|||
|
|
// #endif
|
|||
|
|
|
|||
|
|
// 使用上面定义的图表配置项
|
|||
|
|
const option = chartOption
|
|||
|
|
|
|||
|
|
// 初始化图表
|
|||
|
|
const initChart = async () => {
|
|||
|
|
if (chartRef.value === null) return
|
|||
|
|
|
|||
|
|
try {
|
|||
|
|
const chart = await chartRef.value.init(echarts, null)
|
|||
|
|
chart.setOption(option)
|
|||
|
|
} catch (error) {
|
|||
|
|
console.error('图表初始化失败:', error)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
|
|||
|
|
## 高级功能 💪
|
|||
|
|
|
|||
|
|
### 数据更新 🔄
|
|||
|
|
|
|||
|
|
图表支持动态更新数据,有两种常用方式:
|
|||
|
|
|
|||
|
|
#### 方式一:通过组件引用更新
|
|||
|
|
|
|||
|
|
```js
|
|||
|
|
// Vue 3 Composition API
|
|||
|
|
chartRef.value?.setOption(newOption)
|
|||
|
|
|
|||
|
|
// Vue 2 Options API
|
|||
|
|
this.$refs.chart.setOption(newOption)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 方式二:通过图表实例更新
|
|||
|
|
|
|||
|
|
```js
|
|||
|
|
// 在初始化时保存图表实例
|
|||
|
|
let chartInstance = null
|
|||
|
|
|
|||
|
|
const initChart = async () => {
|
|||
|
|
if (!chartRef.value) return
|
|||
|
|
chartInstance = await chartRef.value.init(echarts)
|
|||
|
|
chartInstance.setOption(option)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 后续更新数据
|
|||
|
|
const updateChart = () => {
|
|||
|
|
if (chartInstance) {
|
|||
|
|
chartInstance.setOption(newData)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 图表大小调整 📏
|
|||
|
|
|
|||
|
|
当容器大小改变时,可以调用 `resize` 方法重新调整图表尺寸:
|
|||
|
|
|
|||
|
|
```js
|
|||
|
|
// 自动适应容器大小
|
|||
|
|
chartRef.value?.resize()
|
|||
|
|
|
|||
|
|
// 手动指定尺寸
|
|||
|
|
chartRef.value?.resize({
|
|||
|
|
width: 375, // 像素值
|
|||
|
|
height: 375 // 像素值
|
|||
|
|
})
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**💡 提示**:在窗口大小变化或屏幕旋转时,可以监听相应事件并调用 `resize` 方法。
|
|||
|
|
|
|||
|
|
### Vue 2 兼容配置 🔄
|
|||
|
|
|
|||
|
|
如果您的项目使用 Vue 2,需要先安装并引入 Vue Composition API:
|
|||
|
|
|
|||
|
|
```js
|
|||
|
|
// main.js
|
|||
|
|
import Vue from 'vue'
|
|||
|
|
import VueCompositionAPI from '@vue/composition-api'
|
|||
|
|
Vue.use(VueCompositionAPI)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
详细配置请参考:[Vue Composition API 官方文档](https://uniapp.dcloud.net.cn/tutorial/vue-composition-api.html)
|
|||
|
|
|
|||
|
|
### 组件标签说明 🏷️
|
|||
|
|
|
|||
|
|
| 标签名 | 说明 |
|
|||
|
|
|-------|------|
|
|||
|
|
| `l-echart` | 正式使用的组件标签 |
|
|||
|
|
| `lime-echart` | 演示用组件标签 |
|
|||
|
|
|
|||
|
|
### 快速预览 🚀
|
|||
|
|
|
|||
|
|
导入插件后,可以直接使用演示标签查看效果:
|
|||
|
|
|
|||
|
|
```html
|
|||
|
|
<template>
|
|||
|
|
<view style="width: 100%; height: 400px;">
|
|||
|
|
<!-- 演示组件 -->
|
|||
|
|
<lime-echart />
|
|||
|
|
</view>
|
|||
|
|
</template>
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 常见问题与解决方案 🐛
|
|||
|
|
|
|||
|
|
### 平台特殊问题
|
|||
|
|
|
|||
|
|
#### 微信小程序
|
|||
|
|
- **画布层级问题**:微信开发工具中 canvas 可能出现层级过高或不跟随页面滚动的情况,真机环境下通常不受影响
|
|||
|
|
- **Tooltip 阴影**:如需去除文字阴影,可添加配置:`tooltip.shadowBlur = 0`
|
|||
|
|
|
|||
|
|
#### 钉钉小程序
|
|||
|
|
- **文字测量精度**:由于钉钉小程序没有原生 `measureText`,字体粗细测量可能不够精确
|
|||
|
|
- **安全扫描警告**:如遇到 `Uint8Clamped` 安全问题,可按以下方式修改 ECharts 文件:
|
|||
|
|
```js
|
|||
|
|
// 查找类似代码并修改
|
|||
|
|
// 原代码
|
|||
|
|
["Int8","Uint8","Uint8Clamped","Int16","Uint16","Int32","Uint32","Float32","Float64"],(function(t,e){return t["[object "+e+"Array]"]
|
|||
|
|
// 修改为
|
|||
|
|
["Int8","Uint8","Uint8_Clamped","Int16","Uint16","Int32","Uint32","Float32","Float64"],(function(t,e){return t["[object "+e.replace('_','')+"Array]"]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 功能限制 ⚠️
|
|||
|
|
- **Toolbox**:不支持 `saveImage` 功能
|
|||
|
|
- **Lines 图表**:不支持 `trailLength` 属性,请设置为 `0`
|
|||
|
|
- **DataZoom**:H5 平台不建议设置 `showDetail` 属性
|
|||
|
|
- **自定义 Tooltips**:uvue 和 vue 中不支持 DOM 操作相关的自定义 Tooltips
|
|||
|
|
|
|||
|
|
## API 参考 📝
|
|||
|
|
|
|||
|
|
### Props
|
|||
|
|
|
|||
|
|
| 参数 | 说明 | 类型 | 默认值 | 版本 |
|
|||
|
|
|------|------|------|--------|------|
|
|||
|
|
| l-style | 自定义样式 | string | - | - |
|
|||
|
|
| type | 指定 canvas 类型(废除) | string | "2d" | - |
|
|||
|
|
| is-disable-scroll | 触摸图表时是否禁止页面滚动 | boolean | false | - |
|
|||
|
|
| beforeDelay | 延迟初始化时间(毫秒) | number | 30 | - |
|
|||
|
|
| enableHover | PC端是否启用鼠标悬浮效果(废除) | boolean | false | - |
|
|||
|
|
| landscape | 是否旋转90度,模拟横屏效果 | boolean | false | - |
|
|||
|
|
| autoHideTooltip | 是否自动隐藏Tooltip | boolean | false | - |
|
|||
|
|
|
|||
|
|
### 组件方法
|
|||
|
|
|
|||
|
|
| 方法名 | 参数 | 返回值 | 说明 |
|
|||
|
|
|--------|------|--------|------|
|
|||
|
|
| init | `echarts: Object, config?: Object` | `Promise<ChartInstance>` | 初始化图表实例 |
|
|||
|
|
| setOption | `option: Object` | `void` | 设置或更新图表配置项 |
|
|||
|
|
| resize | `size?: {width: number, height: number}` | `void` | 调整图表尺寸 |
|
|||
|
|
| clear | `-` | `void` | 清空图表内容 |
|
|||
|
|
| dispose | `-` | `void` | 销毁图表实例 |
|
|||
|
|
| showLoading | `-` | `void` | 显示加载动画 |
|
|||
|
|
| hideLoading | `-` | `void` | 隐藏加载动画 |
|
|||
|
|
| canvasToTempFilePath | `options: Object` | `Promise<Object>` | 生成图表图片,与 uni-app 官方 API 类似,但无需传入 canvasId |
|
|||
|
|
|
|||
|
|
### 事件
|
|||
|
|
|
|||
|
|
| 事件名 | 参数 | 说明 |
|
|||
|
|
|--------|------|------|
|
|||
|
|
| finished | 无 | 图表准备就绪时触发,此时可调用 init 方法 |
|
|||
|
|
|
|||
|
|
## 其他平台依赖说明 🌐
|
|||
|
|
|
|||
|
|
### uni-app 非 nvue 端
|
|||
|
|
|
|||
|
|
- **推荐使用 `npm` 安装**
|
|||
|
|
- 通过 npm 安装可以获得完整的 ES 模块格式支持
|
|||
|
|
```bash
|
|||
|
|
npm install echarts --save
|
|||
|
|
```
|
|||
|
|
- 安装后可直接在代码中通过 `import` 引入
|
|||
|
|
```js
|
|||
|
|
import * as echarts from 'echarts'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### uni-app-x 非 App 端
|
|||
|
|
|
|||
|
|
- **推荐使用 npm 安装**获取 ES 模块格式
|
|||
|
|
```bash
|
|||
|
|
npm install echarts --save
|
|||
|
|
```
|
|||
|
|
- ES 模块格式具有更好的性能和构建优化支持
|
|||
|
|
- 通过 `import` 引入使用
|
|||
|
|
```js
|
|||
|
|
import * as echarts from 'echarts'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
> 💡 注意:H5 和 App 原生环境通常不需要手动引入 ECharts,组件会自动处理。只有在需要自定义 ECharts 版本或配置时才需要手动引入。
|
|||
|
|
|
|||
|
|
## 技术支持 🆘
|
|||
|
|
|
|||
|
|
如果您在使用过程中遇到问题,可以通过以下方式获取帮助:
|
|||
|
|
|
|||
|
|
1. 查看 [在线文档](https://limeui.qcoon.cn/#/echart) 获取详细使用说明
|
|||
|
|
2. 检查 [常见问题](#常见问题与解决方案) 章节查找解决方案
|
|||
|
|
|
|||
|
|
## 贡献与支持 💙
|
|||
|
|
|
|||
|
|
如果您觉得本插件对您有帮助,欢迎给作者点个赞或提供支持:
|
|||
|
|
|
|||
|
|
| 支付宝 | 微信 |
|
|||
|
|
|--------|------|
|
|||
|
|
|  |  |
|
|||
|
|
|
|||
|
|
您的支持是作者持续开发和维护的动力! 🌟
|