# Vue-ECharts
> Vue.js component for Apache ECharts.
> [π¨π³ δΈζη](./README.zh-Hans.md)
Uses [Apache ECharts](http://echarts.baidu.com/index.html) 5 and works for both [Vue.js](https://vuejs.org/) 2/3.
## π‘ Heads up π‘
If you are migrating from `vue-echarts` β€ 5, you should read the _[Migration to v6](#migration-to-v6)_ section before you update to v6.
Not ready yet? Read documentation for older versions [here β](https://github.com/ecomfe/vue-echarts/tree/5.x)
## Installation & Usage
### npm & ESM
```bash
$ npm install echarts vue-echarts
```
To make `vue-echarts` work for Vue 2, you need to have `@vue/composition-api` installed:
```sh
npm i -D @vue/composition-api
```
Vue 3
```js
import { createApp } from 'vue'
import ECharts from 'vue-echarts'
// import ECharts modules manually to reduce bundle size
import {
CanvasRenderer
} from 'echarts/renderers'
import {
BarChart
} from 'echarts/charts'
import {
GridComponent,
TooltipComponent
} from 'echarts/components'
const app = createApp(...)
// register globally (or you can do it locally)
app.component('v-chart', ECharts)
app.mount(...)
```
Vue 2
```js
import Vue from 'vue'
import ECharts from 'vue-echarts'
// import ECharts modules manually to reduce bundle size
import {
CanvasRenderer
} from 'echarts/renderers'
import {
BarChart
} from 'echarts/charts'
import {
GridComponent,
TooltipComponent
} from 'echarts/components'
// register globally (or you can do it locally)
Vue.component('v-chart', ECharts)
new Vue(...)
```
We encourage manually importing components and charts from ECharts for smaller bundle size. See all supported renderers/charts/components [here β](https://github.com/apache/echarts/blob/master/src/echarts.all.ts)
But if you really want to import the whole ECharts bundle without having to import modules manually, just add this in your code:
```js
import "echarts";
```
#### SFC example
Vue 3
```vue
```
[Demo β](https://codesandbox.io/s/charming-night-2y6m6?file=/src/App.vue)
Vue 2
```vue
```
[Demo β](https://codesandbox.io/s/suspicious-glitter-mk66j?file=/src/App.vue)
### CDN & Global variable
Drop `
```
```js
const app = Vue.createApp(...)
// register globally (or you can do it locally)
app.component('v-chart', VueECharts)
```
[Demo β](https://codesandbox.io/api/v1/sandboxes/define?parameters=N4IgZglgNgpgziAXKCA7AJjAHgOgBYAuAtlEqAMYD2qBMNSIAPAIQAiA8gMIAqAmgAoBRAASESAPgA6qRmKhSZeGAEN0CxnAIBPWAoDEygA6HhwacNEwIAc0KJhAFgAMTw1gDc0gL7TGAek0dGHU_JVV1ACNKdC11dAgAN2EIdABeSRAjQwyFC0YEgFpyPGUAJwJhZQBXAkpS-AgALxhhREpDAghqdJB2zuoMvxD4hPU4clKIDuE4UvIewgJDOEQ_P3J0VBwAKzhMKETSnFQYAj9UQyI_BKqYAAEAZhwnHAB2HP9xyY6xiamK2bzDKLZardabHZ7GAHBJHE5nC5XGDFMoEOB3ACszxwACYPgE_j9fF9_jM5gsCEsVmsNltdvtDsdTudLtdbgVkSVyuiAGzYpwFOY4ACM-JJRJk4oICgAarccBMVLQAILGAAUZlQFnQygIyjVAEpTOYLMJ6gQqqUtZrTaa-l1UPYbbbTbQsAQAMraWBOk0u01gagEABiyiI0C09gA5ABJGgwUoAGmEGQAEtCEqcIORlMIAHIwW4ZZPKybKKDJuDKVBwApwBMQMBRv0uryJlu2zoEH3GrX-13YAj2DLcUrKMCQcjCD2US3keDFjsu2BgIcpkDz-OlDJLixt3fCWqUKCdQy-vv9w-TazWBPDkAQWhERcX_uB0pEXW0Ur34DKLzCIwESlEMwARABTrkABGroF4ACkBo7q-tr7shpqwLeGDnpeFh1BAdBrhkmblNm5YvjhwgroRIBUeROE6nq9gANoHraGSsBA9TkAQdEURkgiftAvE4RkyroPmpwAO51AA1nAwmXhkMopDAlDCGJ8kgO2aH-hkHoqHMeDCIIqDWGgC4gKxwgALoHqhl71pM8DMVZzoUagYYwPeo7jpO06znMFnaRRFjaIYXnroY-EKf2Y7xFUKzrhiGJwTF_qbt-LkgBiTipVp648rlGTWcFIUMcoLk6f2wDCAk5a3PYDwPBiyYeUQEXsZxyI8SAwj2SFFg1XVUANcIDzCk4rWefeAnKEJvX9QNQ31RFOIPA4U3tfeYkSQQ0mlHJGR9aVS21St9jCs1m0dSAymYGpGlHYtIXLSNEXChiDgABzXfe-llMUxmmeZml9VZFgleDwgwEQhglHAECJW5IWPjDXpBNhA2mnAJToJQkkAEIjT-wgTSdWM46o-PsBO9YEAAGvYk1Q7alN45JnDHnU96lNYET6pNwiC8LOAYohllVf6PiS6a0sUXL_a2WhCt7p4fbS14iF9gqlCw9QBFqkRRRcj1yZyjAgicCbcBaxYOBELONCGyABjGBkBpq58hLSr4fhRDEIRyOIIBeKHQA)
Vue 2
```html
```
```js
// register globally (or you can do it locally)
Vue.component("v-chart", VueECharts);
```
[Demo β](https://codesandbox.io/api/v1/sandboxes/define?parameters=N4IgZglgNgpgziAXKCA7AJjAHgOgBYAuAtlEqAMYD2qBMNSIAPAIQAiA8gMIAqAmgAoBRAASESAPgA6qRmKhSZeGAEN0CxnAIBPWAoDEygA6HhwacNEwIAc0KJhAFgAMTw1gDc0gL7TGAek0dGHU_JVV1ACNKdC11dAgAN2EIdABeSRAjQwyFC0YEgFpyPGUAJwJhZQBXAkpS-AgALxhhREpDAghqdJB2zuoMvxD4hPU4clKIDuE4UvIewgJDOEQ_P3J0VBwAKzhMKETSnFQYAj9UQyI_BKqYAAEAJhwANhwARgec_3HJjrGJqYVWbzDKLZardabHZ7GAHBJHE5nC5XO43GDrShEQyUOAQfqoApGCB3N44JxkgpzHAAZi-AQBf18P0BMzmCwISxWaw2W12-0Ox1O50ufhgxTKBDgdwArGScJ8QOJvgyCP9fkC2aCOeDuVC-bCBYjhVc0QUxSVylLXuSnJTyO86czGTInarpAA1W44KhY6h0AgACgyhXF5QyABphJ6YIJOBbJQBKTyoaQnADuUduAbMqAssPsGQMxgj5mE6GUBGUAYTplLFnqBCqpVzOYsbeEfS6qHsrfbbdoWAIAGVtLAe3W-xYwNQCAAxZREaBaewAcgAkjQYKVIxkABKwhKnCDkZTCAByMFuEeEAEFJsooJG4MpUHACnAtxAwCuJ-2vOHf37PEx1rXNJ37bACALEBuFKZQwEgchhCHSgm3IeASzA8DhFgMAoOEDJ0M3UoMkAix_zI4RakoKBOkMccsPAghJmsawt2gvEYCITDsKnOoiArWhSmg4BlC8YRGAiUohmACJxJ7chxOzdAvAAUgTUjGL_ACtLbWA2IwBjeI7SZ_Wgw9ymPB8eN43D8IyOybOw8tK3sABtSj2wyVgIHqcgCCc3iMkEAToEC7CMhvdBz1ONM6gAazgcLwIyd0UhgShb3QJKQB04yLAyIcVDmPBhEEVBrDQDCQE84QAF1KIo3SLA_UyVmEDzmrbXtjNQBcYGg2D4MQ5DULmaq8vy7RDAGgiQEMCAYGSyc4PiKp2oyaVpVU5a-yIoT3M2pwdtyubnmOjI6sm4yXOUQ6usnYBhASB9bnsalqWlSM-qIWbvN8sUApAYQmvy7rnte2bqTeJxvv66CQuUMLgdBsHTAhqA3uEB5qQcOHfugqKYoIOLSkSjIQeu_KnpezHZreT78b-kA0swTKopyynavbGnIfsN5pQcAAOJnoKKspijKiqqs5nwHrbK7ueELjDBKXF2p6_LOKIEcgiMtGWpKdBKDTAAhTHhOEGGqbBuAjZN9gEI_AgAA17FhpX2zt1QTc4Gi6mg0prAiKtYeEMOI5waUNJq-W_yVuXjMT8CGt05PyOTcjvCTXx6XVEIohiEI5HEEAvHLoA)
See more examples [here](https://github.com/ecomfe/vue-echarts/tree/main/src/demo).
### Props
- `init-options: object`
Optional chart init configurations. See `echarts.init`'s `opts` parameter [here β](https://echarts.apache.org/en/api.html#echarts.init)
Injection key: `INIT_OPTIONS_KEY`.
- `theme: string | object`
Theme to be applied. See `echarts.init`'s `theme` parameter [here β](https://echarts.apache.org/en/api.html#echarts.init)
Injection key: `THEME_KEY`.
- `option: object`
ECharts' universal interface. Modifying this prop will trigger ECharts' `setOption` method. Read more [here β](https://echarts.apache.org/en/option.html)
- `update-options: object`
Options for updating chart option. See `echartsInstance.setOption`'s `opts` parameter [here β](https://echarts.apache.org/en/api.html#echartsInstance.setOption)
Injection key: `UPDATE_OPTIONS_KEY`.
- `group: string`
Group name to be used in chart [connection](https://echarts.apache.org/en/api.html#echarts.connect). See `echartsInstance.group` [here β](https://echarts.apache.org/en/api.html#echartsInstance.group)
- `autoresize: boolean` (default: `false`)
Whether the chart should be resized automatically whenever its root is resized.
- `loading: boolean` (default: `false`)
Whether the chart is in loading state.
- `loading-options: object`
Configuration item of loading animation. See `echartsInstance.showLoading`'s `opts` parameter [here β](https://echarts.apache.org/en/api.html#echartsInstance.showLoading)
Injection key: `LOADING_OPTIONS_KEY`.
- `manual-update: boolean` (default: `false`)
For performance critical scenarios (having a large dataset) we'd better bypass Vue's reactivity system for `option` prop. By specifying `manual-update` prop with `true` and not providing `option` prop, the dataset won't be watched any more. After doing so, you need to retrieve the component instance with `ref` and manually call `setOption` method to update the chart.
### Provide / Inject
Vue-ECharts provides provide/inject API for `theme`, `init-options`, `update-options` and `loading-options` to help configuring contextual options. eg. for `init-options` you can use the provide API like this:
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]: { ... }
}
}
```
### Methods
- `setOption` [β](https://echarts.apache.org/en/api.html#echartsInstance.setOption)
- `getWidth` [β](https://echarts.apache.org/en/api.html#echartsInstance.getWidth)
- `getHeight` [β](https://echarts.apache.org/en/api.html#echartsInstance.getHeight)
- `getDom` [β](https://echarts.apache.org/en/api.html#echartsInstance.getDom)
- `getOption` [β](https://echarts.apache.org/en/api.html#echartsInstance.getOption)
- `resize` [β](https://echarts.apache.org/en/api.html#echartsInstance.resize)
- `dispatchAction` [β](https://echarts.apache.org/en/api.html#echartsInstance.dispatchAction)
- `convertToPixel` [β](https://echarts.apache.org/en/api.html#echartsInstance.convertToPixel)
- `convertFromPixel` [β](https://echarts.apache.org/en/api.html#echartsInstance.convertFromPixel)
- `containPixel` [β](https://echarts.apache.org/en/api.html#echartsInstance.containPixel)
- `showLoading` [β](https://echarts.apache.org/en/api.html#echartsInstance.showLoading)
- `hideLoading` [β](https://echarts.apache.org/en/api.html#echartsInstance.hideLoading)
- `containPixel` [β](https://echarts.apache.org/en/api.html#echartsInstance.containPixel)
- `getDataURL` [β](https://echarts.apache.org/en/api.html#echartsInstance.getDataURL)
- `getConnectedDataURL` [β](https://echarts.apache.org/en/api.html#echartsInstance.getConnectedDataURL)
- `clear` [β](https://echarts.apache.org/en/api.html#echartsInstance.clear)
- `dispose` [β](https://echarts.apache.org/en/api.html#echartsInstance.dispose)
### Static Methods
Static methods can be accessed from [`echarts` itself](https://echarts.apache.org/en/api.html#echarts).
### Events
Vue-ECharts support the following events:
- `highlight` [β](https://echarts.apache.org/en/api.html#events.highlight)
- `downplay` [β](https://echarts.apache.org/en/api.html#events.downplay)
- `selectchanged` [β](https://echarts.apache.org/en/api.html#events.selectchanged)
- `legendselectchanged` [β](https://echarts.apache.org/en/api.html#events.legendselectchanged)
- `legendselected` [β](https://echarts.apache.org/en/api.html#events.legendselected)
- `legendunselected` [β](https://echarts.apache.org/en/api.html#events.legendunselected)
- `legendselectall` [β](https://echarts.apache.org/en/api.html#events.legendselectall)
- `legendinverseselect` [β](https://echarts.apache.org/en/api.html#events.legendinverseselect)
- `legendscroll` [β](https://echarts.apache.org/en/api.html#events.legendscroll)
- `datazoom` [β](https://echarts.apache.org/en/api.html#events.datazoom)
- `datarangeselected` [β](https://echarts.apache.org/en/api.html#events.datarangeselected)
- `timelinechanged` [β](https://echarts.apache.org/en/api.html#events.timelinechanged)
- `timelineplaychanged` [β](https://echarts.apache.org/en/api.html#events.timelineplaychanged)
- `restore` [β](https://echarts.apache.org/en/api.html#events.restore)
- `dataviewchanged` [β](https://echarts.apache.org/en/api.html#events.dataviewchanged)
- `magictypechanged` [β](https://echarts.apache.org/en/api.html#events.magictypechanged)
- `geoselectchanged` [β](https://echarts.apache.org/en/api.html#events.geoselectchanged)
- `geoselected` [β](https://echarts.apache.org/en/api.html#events.geoselected)
- `geounselected` [β](https://echarts.apache.org/en/api.html#events.geounselected)
- `axisareaselected` [β](https://echarts.apache.org/en/api.html#events.axisareaselected)
- `brush` [β](https://echarts.apache.org/en/api.html#events.brush)
- `brushEnd` [β](https://echarts.apache.org/en/api.html#events.brushEnd)
- `brushselected` [β](https://echarts.apache.org/en/api.html#events.brushselected)
- `globalcursortaken` [β](https://echarts.apache.org/en/api.html#events.globalcursortaken)
- `rendered` [β](https://echarts.apache.org/en/api.html#events.rendered)
- `finished` [β](https://echarts.apache.org/en/api.html#events.finished)
- Mouse events
- `click` [β](https://echarts.apache.org/en/api.html#events.Mouse%20events.click)
- `dblclick` [β](https://echarts.apache.org/en/api.html#events.Mouse%20events.dblclick)
- `mouseover` [β](https://echarts.apache.org/en/api.html#events.Mouse%20events.mouseover)
- `mouseout` [β](https://echarts.apache.org/en/api.html#events.Mouse%20events.mouseout)
- `mousemove` [β](https://echarts.apache.org/en/api.html#events.Mouse%20events.mousemove)
- `mousedown` [β](https://echarts.apache.org/en/api.html#events.Mouse%20events.mousedown)
- `mouseup` [β](https://echarts.apache.org/en/api.html#events.Mouse%20events.mouseup)
- `globalout` [β](https://echarts.apache.org/en/api.html#events.Mouse%20events.globalout)
- `contextmenu` [β](https://echarts.apache.org/en/api.html#events.Mouse%20events.contextmenu)
- ZRender events
- `zr:click`
- `zr:mousedown`
- `zr:mouseup`
- `zr:mousewheel`
- `zr:dblclick`
- `zr:contextmenu`
See supported events [here β](https://echarts.apache.org/en/api.html#events)
## Migration to v6
> π‘ Please make sure to read the [migration guide](https://echarts.apache.org/en/tutorial.html#ECharts%205%20Upgrade%20Guide) for ECharts 5 as well.
The following breaking changes are introduced in `vue-echarts@6`:
### Vue 2 support
- Now `@vue/composition-api` is required to be installed to use Vue-ECharts with Vue 2.
### Props
- `options` is renamed to **`option`** to align with ECharts itself.
- Updating `option` will respect **`update-options`** configs instead of checking reference change.
- `watch-shallow` is removed. Use **`manual-update`** for performance critical scenarios.
### Methods
- `mergeOptions` is renamed to **`setOption`** to align with ECharts itself.
- `showLoading` and `hideLoading` is removed. Use the **`loading` and `loading-options`** props instead.
- `appendData` is removed. (Due to ECharts 5's breaking change.)
- All static methods are removed from `vue-echarts`. Use those methods from `echarts` directly.
### Computed getters
- Computed getters (`width`, `height`, `isDisposed` and `computedOptions`) are removed. Use the **`getWidth`, `getHeight`, `isDisposed` and `getOption`** methods instead.
### Styles
- Now the root element of the component have **`100%Γ100%`** size by default, instead of `600Γ400`.
## Local development
```bash
$ npm i
$ npm run serve
```
Open `http://localhost:8080` to see the demo.