1.安装echarts
npm install echarts -S
2.在main.js中引用echarts
import echarts from 'echarts' Vue.prototype.$echarts = echarts
3.封装chart组件
在components中新建chart.vue
<template>
<div class="chart">
<div class="chart" :id="id" :option="option"></div>
</div>
</template>
<script>
export default {
props: {
id: {
type: String
},
option: {
type: Object
}
},
mounted () {
this.$echarts.init(document.getElementById(this.id)).setOption(this.option)
}
}
</script>
<style scoped>
</style>
4.其他组件调用图表组件
<template>
<div class="hello">
<Chart :id="id" :option="pieOption"></Chart>
</div>
</template>
<script>
import Chart from './Chart'
export default {
name: 'HelloWorld',
components: {
Chart
},
data () {
return {
msg: 'Welcome to Your Vue.js App',
id: 'pie',
pieOption: {
tooltip : {
trigger: 'item',
formatter: "{a} <br/>{b} : {c} "
},
calculable : false,
series : [
{
name: '',
type: 'pie',
radius: '45%', //饼图的半径大小
center: ['40%', '60%'], //饼图的位置
label: {show:true},
labelLine: {show: true, length: 0},
data:[
{
value: 20, name: '余'
},
{
value: 20, name: '已开'
},
]
}
]
}
}
}
}
}
</script>
5.动态获取数据展示到图表中
在图表组件中加监听,option改变就执行
watch: {
//观察option的变化
option: {
handler(newVal, oldVal) {
if (this.chart) {
if (newVal) {
this.chart.setOption(newVal);
} else {
this.chart.setOption(oldVal);
}
} else {
this.init();
}
},
deep: true //对象内部属性的监听,关键。
}
},
在页面中引用
import Echarts from '@/components/publics/Echarts'
import {lineChartFun} from '@/../static/js/package'
export default {
name: 'incomeIndex',
data () {
return {
id: 'echartsOnlyLineJX',
id2: 'echartsManyLineJX',
option: {},
option2: {}
}
},
mounted () {
this.getAjax()
},
components: {
Echarts
},
methods: {
href () {
console.log('22')
this.$router.go("/incomeTotal")
},
getAjax (){
let xData = ['一月','二月','三月','四月','五月','六月','七月','八月','九月','十月','十一月','十二月']
let YDataJX = [
{
name:'进项金额',
type:'line',
color:'#008DFF',
itemStyle: {normal: {
areaStyle: {type: 'default'}
}},
data:[120, 132, 101, 134, 90, 230, 210,220, 182, 191, 234, 290],
},
{
name:'进项税额',
type:'line',
color:'rgba(0,189,177,1)',
itemStyle: {normal: {areaStyle: {type: 'default'}}},
data:[220, 182, 191, 234, 290, 330, 310,120, 132, 101, 134, 90]
}
];
let lendJX = ['进项金额','进项税额'];
let onlyLendJX = ['进项发票数量'];
let onlyYDataJX = [
{
name:'进项发票数量',
type:'line',
smooth:true,
color:'#008DFF',
itemStyle: {normal: {areaStyle: {type: 'default',color: new this.$echarts.graphic.LinearGradient(0, 0, 0, 1, [{
offset: 0,
color: 'rgba(0,193,255,0.53)'
},{
offset: 1,
color: 'rgba(0,141,255,0.30)'
}])
}}},
data:[12, 13, 10, 14, 20, 23, 21,22, 18, 19, 23, 29]
},
]
this.option = lineChartFun(xData,onlyYDataJX,onlyLendJX);
this.option2 = lineChartFun(xData,YDataJX,lendJX)
}
}
}
生成option封装成方法
//折线图调用函数
export const lineChartFun = (xData,YData,lend) => {
var option = {
tooltip: {
trigger: 'axis'
},
legend: {
data:lend,
top:'5px'
},
grid:{
left:'50px',
right:'50px',
top:'50px',
bottom:'20px'
},
xAxis : [
{
type: 'category',
boundaryGap: false,
data:xData
},
],
yAxis : [
{
type : 'value'
}
],
series: YData
}
return option
}
6.屏幕拖动时echarts自适应
methods: {
init() {
let _this = this;
this.eComVisitChart = this.$echarts.init(document.getElementById(this.id));
this.eComVisitChart.setOption(this.option);
window.addEventListener('resize',function(){
_this.eComVisitChart.resize()
})
}
},
完整的echarts组件
<template>
<div class="chart">
<div :id="id" :option="option"></div>
</div>
</template>
<script>
export default {
// 验证类型
data () {
return {
eComVisitChart:null
}
},
props: {
id: {
type: String
},
option: {
type: Object
}
},
mounted() {
this.init()
},
methods: {
init() {
let _this = this;
this.eComVisitChart = this.$echarts.init(document.getElementById(this.id));
this.eComVisitChart.setOption(this.option);
window.addEventListener('resize',function(){
_this.eComVisitChart.resize()
})
}
},
watch: {
//观察option的变化
option: {
handler(newVal, oldVal) {
if (this.chart) {
if (newVal) {
this.chart.setOption(newVal);
} else {
this.chart.setOption(oldVal);
}
} else {
this.init();
}
},
deep: true //对象内部属性的监听,关键。
}
},
beforeDestroy () {
if (this.eComVisitChart) {
this.eComVisitChart.clear()
}
}
}
</script>
<style scoped>
</style>
来源:https://www.cnblogs.com/SunShineM/p/9006840.html