# Vue-ECharts > Apache ECharts 的 Vue.js 组件。 使用 [Apache ECharts](https://echarts.apache.org/zh/index.html) 5,同时支持 [Vue.js](https://vuejs.org/) 2/3。 ## 💡 注意 💡 若您准备从 `vue-echarts` ≤ 5 的版本迁移到新版本,请在升级 v6 前阅读 _[迁移到 v6](#迁移到-v6)_ 部分文档。 没准备好的话,可以继续阅读老版本的文档。[前往 →](https://github.com/ecomfe/vue-echarts/blob/5.x/README.zh_CN.md) ## 安装 & 使用 ### npm & ESM ```bash $ npm install echarts vue-echarts ``` 要在 *Vue 2* 下使用 `vue-echarts`,需要确保 `@vue/composition-api` 已经安装: ```sh npm i -D @vue/composition-api ``` 如果你在使用基于 *Vue 2* 的 *NuxtJS*,那么还需要安装 `@nuxtjs/composition-api`: ```sh npm i -D @nuxtjs/composition-api ``` 然后在 `nuxt.config.js` 的 `buildModules` 选项中添加 `'@nuxtjs/composition-api/module'`。
Vue 3 ```js import { createApp } from 'vue' import ECharts from 'vue-echarts' import { use } from "echarts/core"; // 手动引入 ECharts 各模块来减小打包体积 import { CanvasRenderer } from 'echarts/renderers' import { BarChart } from 'echarts/charts' import { GridComponent, TooltipComponent } from 'echarts/components' use([ CanvasRenderer, BarChart, GridComponent, TooltipComponent ]); const app = createApp(...) // 全局注册组件(也可以使用局部注册) app.component('v-chart', ECharts) app.mount(...) ```
Vue 2 ```js import Vue from 'vue' import ECharts from 'vue-echarts' import { use } from 'echarts/core' // 手动引入 ECharts 各模块来减小打包体积 import { CanvasRenderer } from 'echarts/renderers' import { BarChart } from 'echarts/charts' import { GridComponent, TooltipComponent } from 'echarts/components' use([ CanvasRenderer, BarChart, GridComponent, TooltipComponent ]); // 全局注册组件(也可以使用局部注册) Vue.component('v-chart', ECharts) new Vue(...) ```
为了更小的打包体积,我们建议手动从 ECharts 引入单个图表和组件。请参考所有支持的渲染器/图表/组件。[前往 →](https://github.com/apache/echarts/blob/master/src/echarts.all.ts) 但如果你实在需要全量引入 ECharts 从而无需手动引入模块,只需要在代码中添加: ```js import "echarts"; ``` #### 单文件组件示例
Vue 3 ```vue ```
Vue 2 ```vue ```
### CDN & 全局变量 用如下方式在 HTML 中插入 ` ``` ```js const app = Vue.createApp(...) // 全局注册组件(也可以使用局部注册) app.component('v-chart', VueECharts) ``` [Demo →](https://codesandbox.io/api/v1/sandboxes/define?parameters=N4IgZglgNgpgziAXKCA7AJjAHgOgBYAuAtlEqAMYD2qBMNSIAPAIQAiA8gMIAqAmgAoBRAASESAPgA6qRmKhSZeGAEN0CxnAIBPWAoDEygA6HhwacNEwIAc0KJhAFgAMTw1gDc0gL7TGAek0dGHU_JVV1ACNKdC11dAgAN2EIdABeSRAjQwyFC0YEgFpyPGUAJwJhZQBXAkpS-AgALxhhREpDAghqdJB2zuoMvxD4hPU4clKIDuE4UvIewgJDOEQ_P3J0VBwAKzhMKETSnFQYAj9UQyI_BKqYAAEAZhwAJheANhz_ccmOsYmpiqzeYZRbLVbrTY7PYwA4JI4nM4XK4wYplAhwO4AVheL0-AX-v183wBMzmCwISxWaw2W12-0Ox1O50u11uBRRJXKGLeOCcuJA4i-BIIfx-IukADVbjgJipaABBYwACjMqAs6GUBGUSoAlKZzBZhPUCFVSmrVYbDX0uqh7BbLYbaFgCABlbSwO0Gh2GsDUAgAMWURGgWnsAHIAJI0GClAA0wgyAAkYQlThByMphAA5GC3DLx-WTZRQeNwZSoOAFOAxiBgMNeh1eWMNy2dAge_Vq72O7AEewZbilZRgSDkYQuyim8jwfMth2wMB9hMgafR0oZOcWJub4S1ShQTqGT1d7u7ybWawx_sgCC0Iizk_d32lIia2ila_AZReYSMCKlIZgAiH87XIH8VXQLwAFIdQ3R9LW3eDDVgS8MGPU8LDqCA6CXDJU3KdNiwfDDhAXXCQDI4iMI1LV7AAbR3S0MlYCB6nIAgqJIjJBFfaBOIwjJ5XQbNTgAdzqABrOB-NPDIJRSGBKGEITpJAZskO9DIXRUOY8GEQRUGsNAZxARjhAAXR3RDT2rSZ4Hosz7RI1Agxga9B2HUdx0nOYTPUkiLG0Qw3OXQxsJk7sh3iKoVmXTFMSgiLvVXd8HJATEnEStTlzeTKMnM_yApo5QHI07tgGEBJi1uewHgeTF4xcogQuY1iUQ4kBhGsgKLAqqqoBq4QHgARicRrXOvHjlD4zrup6vrqpC54HgccbmuvISRIIcTSikjIusK-bKsW-xhvqtaWpAeTMCUlT9rmgKFoGkLhsxBwAA4LuvbSymKfTDOM1SurMiwCpB4QYCIQwSjgCBYqcgLb0ht0gnQnrDTgEp0EoUSACEBo_YRRsO9HMdUHH2BHasCAADXsMbwctMnsdEzh9zqa9SmsCJtTG4Q-YFnBMVg0yyu9HwxcNCWSOl7tLKQ2Wt08LsJa8WCuxlSgoeoHClTwopOQ6-MpRgQROENuB1YsHAiEnGg9ZAAxjAyHVlaFMUQiiGIQjkcQQC8AOgA)
Vue 2 ```html ``` ```js // 全局注册组件(也可以使用局部注册) Vue.component("v-chart", VueECharts); ``` [Demo →](https://codepen.io/Justineo/pen/gOLGxJR)
可以在[这里](https://github.com/ecomfe/vue-echarts/tree/main/src/demo)查看更多例子。 ### Prop - `init-options: object` 初始化附加参数。请参考 `echarts.init` 的 `opts` 参数。[前往 →](https://echarts.apache.org/zh/api.html#echarts.init) Inject 键名:`INIT_OPTIONS_KEY`。 - `theme: string | object` 要应用的主题。请参考 `echarts.init` 的 `theme` 参数。[前往 →](https://echarts.apache.org/zh/api.html#echarts.init) Inject 键名:`THEME_KEY`。 - `option: object` ECharts 的万能接口。修改这个 prop 会触发 ECharts 实例的 `setOption` 方法。查看[详情 →](https://echarts.apache.org/zh/option.html) > 💡 在没有指定 `update-options` 时,如果直接修改 `option` 对象而引用保持不变,`setOption` 方法调用时将默认指定 `notMerge: false`;否则,如果为 `option` 绑定一个新的引用,将指定 `notMerge: true`。 - `update-options: object` 图表更新的配置项。请参考 `echartsInstance.setOption` 的 `opts` 参数。[前往 →](https://echarts.apache.org/zh/api.html#echartsInstance.setOption) Inject 键名:`UPDATE_OPTIONS_KEY`。 - `group: string` 图表的分组,用于[联动](https://echarts.apache.org/zh/api.html#echarts.connect)。请参考 `echartsInstance.group`。[前往 →](https://echarts.apache.org/zh/api.html#echartsInstance.group) - `autoresize: boolean`(默认值`false`) 图表在组件根元素尺寸变化时是否需要自动进行重绘。 - `loading: boolean`(默认值:`false`) 图表是否处于加载状态。 - `loading-options: object` 加载动画配置项。请参考 `echartsInstance.showLoading` 的 `opts` 参数。[前往 →](https://echarts.apache.org/zh/api.html#echartsInstance.showLoading) Inject 键名:`LOADING_OPTIONS_KEY`。 - `manual-update: boolean`(默认值`false`) 在性能敏感(数据量很大)的场景下,我们最好对于 `option` prop 绕过 Vue 的响应式系统。当将 `manual-update` prop 指定为 `true` 且不传入 `option` prop 时,数据将不会被监听。然后,需要用 `ref` 获取组件实例以后手动调用 `setOption` 方法来更新图表。 ### Provide / Inject Vue-ECharts 为 `theme`、`init-options`、`update-options` 和 `loading-options` 提供了 provide/inject API,以通过上下文配置选项。例如:可以通过如下方式来使用 provide API 为 `init-options` 提供上下文配置:
Vue 3 ```js import { INIT_OPTIONS_KEY } from 'vue-echarts' import { provide } from 'vue' // composition API provide(INIT_OPTIONS_KEY, ...) // options API { provide: { [INIT_OPTIONS_KEY]: { ... } } } ```
Vue 2 ```js import { INIT_OPTIONS_KEY } from 'vue-echarts' // in component options { provide: { [INIT_OPTIONS_KEY]: { ... } } } ```
### 方法 - `setOption` [→](https://echarts.apache.org/zh/api.html#echartsInstance.setOption) - `getWidth` [→](https://echarts.apache.org/zh/api.html#echartsInstance.getWidth) - `getHeight` [→](https://echarts.apache.org/zh/api.html#echartsInstance.getHeight) - `getDom` [→](https://echarts.apache.org/zh/api.html#echartsInstance.getDom) - `getOption` [→](https://echarts.apache.org/zh/api.html#echartsInstance.getOption) - `resize` [→](https://echarts.apache.org/zh/api.html#echartsInstance.resize) - `dispatchAction` [→](https://echarts.apache.org/zh/api.html#echartsInstance.dispatchAction) - `convertToPixel` [→](https://echarts.apache.org/zh/api.html#echartsInstance.convertToPixel) - `convertFromPixel` [→](https://echarts.apache.org/zh/api.html#echartsInstance.convertFromPixel) - `containPixel` [→](https://echarts.apache.org/zh/api.html#echartsInstance.containPixel) - `showLoading` [→](https://echarts.apache.org/zh/api.html#echartsInstance.showLoading) - `hideLoading` [→](https://echarts.apache.org/zh/api.html#echartsInstance.hideLoading) - `containPixel` [→](https://echarts.apache.org/zh/api.html#echartsInstance.containPixel) - `getDataURL` [→](https://echarts.apache.org/zh/api.html#echartsInstance.getDataURL) - `getConnectedDataURL` [→](https://echarts.apache.org/zh/api.html#echartsInstance.getConnectedDataURL) - `clear` [→](https://echarts.apache.org/zh/api.html#echartsInstance.clear) - `dispose` [→](https://echarts.apache.org/zh/api.html#echartsInstance.dispose) ### 静态方法 静态方法请直接通过 [`echarts` 本身](https://echarts.apache.org/zh/api.html#echarts)进行调用。 ### 事件 Vue-ECharts 支持如下事件: - `highlight` [→](https://echarts.apache.org/zh/api.html#events.highlight) - `downplay` [→](https://echarts.apache.org/zh/api.html#events.downplay) - `selectchanged` [→](https://echarts.apache.org/zh/api.html#events.selectchanged) - `legendselectchanged` [→](https://echarts.apache.org/zh/api.html#events.legendselectchanged) - `legendselected` [→](https://echarts.apache.org/zh/api.html#events.legendselected) - `legendunselected` [→](https://echarts.apache.org/zh/api.html#events.legendunselected) - `legendselectall` [→](https://echarts.apache.org/zh/api.html#events.legendselectall) - `legendinverseselect` [→](https://echarts.apache.org/zh/api.html#events.legendinverseselect) - `legendscroll` [→](https://echarts.apache.org/zh/api.html#events.legendscroll) - `datazoom` [→](https://echarts.apache.org/zh/api.html#events.datazoom) - `datarangeselected` [→](https://echarts.apache.org/zh/api.html#events.datarangeselected) - `timelinechanged` [→](https://echarts.apache.org/zh/api.html#events.timelinechanged) - `timelineplaychanged` [→](https://echarts.apache.org/zh/api.html#events.timelineplaychanged) - `restore` [→](https://echarts.apache.org/zh/api.html#events.restore) - `dataviewchanged` [→](https://echarts.apache.org/zh/api.html#events.dataviewchanged) - `magictypechanged` [→](https://echarts.apache.org/zh/api.html#events.magictypechanged) - `geoselectchanged` [→](https://echarts.apache.org/zh/api.html#events.geoselectchanged) - `geoselected` [→](https://echarts.apache.org/zh/api.html#events.geoselected) - `geounselected` [→](https://echarts.apache.org/zh/api.html#events.geounselected) - `axisareaselected` [→](https://echarts.apache.org/zh/api.html#events.axisareaselected) - `brush` [→](https://echarts.apache.org/zh/api.html#events.brush) - `brushEnd` [→](https://echarts.apache.org/zh/api.html#events.brushEnd) - `brushselected` [→](https://echarts.apache.org/zh/api.html#events.brushselected) - `globalcursortaken` [→](https://echarts.apache.org/zh/api.html#events.globalcursortaken) - `rendered` [→](https://echarts.apache.org/zh/api.html#events.rendered) - `finished` [→](https://echarts.apache.org/zh/api.html#events.finished) - 鼠标事件 - `click` [→](https://echarts.apache.org/zh/api.html#events.Mouse%20events.click) - `dblclick` [→](https://echarts.apache.org/zh/api.html#events.Mouse%20events.dblclick) - `mouseover` [→](https://echarts.apache.org/zh/api.html#events.Mouse%20events.mouseover) - `mouseout` [→](https://echarts.apache.org/zh/api.html#events.Mouse%20events.mouseout) - `mousemove` [→](https://echarts.apache.org/zh/api.html#events.Mouse%20events.mousemove) - `mousedown` [→](https://echarts.apache.org/zh/api.html#events.Mouse%20events.mousedown) - `mouseup` [→](https://echarts.apache.org/zh/api.html#events.Mouse%20events.mouseup) - `globalout` [→](https://echarts.apache.org/zh/api.html#events.Mouse%20events.globalout) - `contextmenu` [→](https://echarts.apache.org/zh/api.html#events.Mouse%20events.contextmenu) - ZRender 事件 - `zr:click` - `zr:mousedown` - `zr:mouseup` - `zr:mousewheel` - `zr:dblclick` - `zr:contextmenu` 请参考支持的事件列表。[前往 →](https://echarts.apache.org/zh/api.html#events) ## 迁移到 v6 > 💡 请确保同时查阅 ECharts 5 的[升级指南](https://echarts.apache.org/zh/tutorial.html#ECharts%205%20%E5%8D%87%E7%BA%A7%E6%8C%87%E5%8D%97)。 `vue-echarts@6` 引入了如下破坏性变更: ### Vue 2 支持 - 要在 Vue 2 中使用 Vue-ECharts,现在必须安装 `@vue/composition-api`。 ### Prop - `options` 重命名为 **`option`**,以和 ECharts 本身保持一致。 - 更新 `option` 将采用 **`update-options`** 中的配置,不再检查是否发生引用变化。 - `watch-shallow` 被移除。在性能关键场景请使用 **`manual-update`**。 ### 方法 - `mergeOptions` 重命名为 **`setOption`**,以和 ECharts 本身保持一致。 - `showLoading` 与 `hideLoading` 被移除。请使用 **`loading` 与 `loading-options`** prop。 - `appendData` 被移除。(由于 ECharts 5 引入的破坏性变更。) - 所有静态方法被从 `vue-echarts` 移除。可以直接使用 `echarts` 本身的这些方法。 ### 计算 Getter - 计算 getter(`width`、`height`、`isDisposed` 和 `computedOptions`)被移除。请分别使用 **`getWidth`、`getHeight`、`isDisposed` 和 `getOption`** 方法代替。 ### 样式 - 现在组件根元素尺寸默认为 **`100%×100%`**,而非原来的 `600×400`。 ## 本地开发 ```bash $ npm i $ npm run serve ``` 打开 `http://localhost:8080` 来查看 demo。