Vue笔记:封装Echarts
Echart.vue组件的封装
data中是固定属性,props中定义动态参数,是父组件获取数据时传递到子组件的参数,xData为横坐标轴数据,series为Echarts的series数据,isAxisChart为是否带有坐标轴。
<template> <div style="height: 100%" ref="echart"> echart </div> </template> <script> import echarts from 'echarts' export default { props: { chartData: { type: Object, default() { return { xData: [], series: [] } } }, isAxisChart: { type: Boolean, default: true } }, computed: { options() { return this.isAxisChart ? this.axisOption : this.normalOption }, isCollapse() { return this.$store.state.tab.isCollapse } }, watch: { chartData: { handler: function() { this.initChart() }, deep: true }, isCollapse() { setTimeout(() => { this.resizeChart() }, 300) } }, data() { return { echart: null, axisOption: { legend: { textStyle: { color: '#333' } }, grid: { left: '20%' }, tooltip: { trigger: 'axis' }, xAxis: { type: 'category', data: [], axisLine: { lineStyle: { color: '#17b3a3' } }, axisLabel: { color: '#333' } }, yAxis: [ { type: 'value', axisLine: { lineStyle: { color: '#17b3a3' } } } ], color: [ '#2ec7c9', '#b6a2de', '#5ab1ef', '#ffb980', '#d87a80', '#8d98b3', '#e5cf0d', '#97b552', '#95706d', '#dc69aa', '#07a2a4', '#9a7fd1', '#588dd5', '#f5994e', '#c05050', '#59678c', '#c9ab00', '#7eb00a', '#6f5553', '#c14089' ], series: [] }, normalOption: { tooltip: { trigger: 'item' }, color: ['#0f78f4', '#dd536b', '#9462e5', '#a6a6a6', '#e1bb22', '#39c362', '#3ed1cf'], series: [] } } }, methods: { initChart() { this.initChartData() if (this.echart) { this.echart.setOption(this.options) } else { this.echart = echarts.init(this.$refs.echart) this.echart.setOption(this.options) } }, initChartData() { if (this.isAxisChart) { this.axisOption.xAxis.data = this.chartData.xData this.axisOption.series = this.chartData.series } else { this.normalOption.series = this.chartData.series } }, resizeChart() { this.echart ? this.echart.resize() : '' } }, mounted() { window.addEventListener('resize', this.resizeChart) }, destroyed() { window.removeEventListener('resize', this.resizeChart) } } </script> <style lang="scss" scoped></style>
简单饼状图
<template> <div> <echart :chartData="echartData.video" style="height: 260px" :isAxisChart="false"></echart> </div> </template> <script> import Echart from '../../components/Echart.vue'; import axis from "axios"; export default { components: { Echart }, data() { return { msg: '我是一个头部组件', echartData: { video: { series: [] } } } }, methods: { getTableData() { axis.get('/api/chartdata1/')//axis后面的.get可以省略; .then((res) => { res = res.data // 视频饼图 this.echartData.video.series.push({ data: res.data.videoData, type: 'pie' }) }) .catch( (error) => { console.log(error); }); }, }, created() { this.getTableData() } } </script> <style lang="scss" scoped> </style>
flask接口构造数据:
# 获取图表数据 # http://127.0.0.1:8081/api/chartdata1/ @app.route('/api/chartdata1/') def chartdata1(): returnres = {"state": 200, "msg": "succsuful", "data": ""} reslist = [{'name':'springboot','value':1000},{'name':'vue','value':800}] resdict = {'videoData': reslist} returnres["data"] = resdict return jsonify(returnres)
柱状图
<template> <div> <echart :chartData="echartData.user" style="height: 260px"></echart> </div> </template> <script> import Echart from '../../components/Echart.vue'; import axis from "axios"; export default { components: { Echart }, data() { return { msg: '我是一个头部组件', echartData: { user: { xData: [], series: [] }, } } }, methods: { getTableData() { axis.get('/api/chartdata2/')//axis后面的.get可以省略; .then((res) => { res = res.data // 用户柱状图 // 坐标轴初始化 this.echartData.user.xData = res.data.userData.map(item => item.date) //数据组 this.echartData.user.series.push({ name: '新增用户', data: res.data.userData.map(item => item.new), type: 'bar' }) this.echartData.user.series.push({ name: '活跃用户', data: res.data.userData.map(item => item.active), type: 'bar', barGap: 0 }) }) .catch( (error) => { console.log(error); }); }, }, created() { this.getTableData() } } </script> <style lang="scss" scoped> </style>
flask构造接口数据:
# 获取图表数据 # http://127.0.0.1:80821/api/chartdata2/?xx= @app.route('/api/chartdata2/') def chartdata2(): returnres = {"state": 200, "msg": "succsuful", "data": ""} reslist = [{'date': '周一', 'new': 100, 'active': 200}, {'date': '周二', 'new': 100, 'active': 200}, {'date': '周三', 'new': 100, 'active': 200}, {'date': '周四', 'new': 100, 'active': 200}, {'date': '周五', 'new': 100, 'active': 200}, {'date': '周六', 'new': 100, 'active': 200}, {'date': '周日', 'new': 100, 'active': 200}] resdict = {'userData': reslist} returnres["data"] = resdict return jsonify(returnres)
折线图
<template> <div> <echart :chartData="echartData.order" style="height: 260px" ></echart> </div> </template> <script> import Echart from '../../components/Echart.vue'; import axis from "axios"; export default { components: { Echart }, data() { return { msg: '我是一个头部组件', echartData: { order: { xData: [], series: [] }, } } }, methods: { getTableData() { axis.get('/api/chartdata3/')//axis后面的.get可以省略; .then((res) => { res = res.data // 订单折线图 const order = res.data.orderData this.echartData.order.xData = order.date // 第一步取出series中的name部分——键名 let keyArray = Object.keys(order.data[0]) // 第二步,循环添加数据 keyArray.forEach(key => { this.echartData.order.series.push({ name: key, data: order.data.map(item => item[key]), type: 'line' }) }) }) .catch( (error) => { console.log(error); }); }, }, created() { this.getTableData() } } </script> <style lang="scss" scoped> </style>
flask接口构造数据:
# 获取图表数据 # http://127.0.0.1:80821/api/chartdata3/?xx= @app.route('/api/chartdata3/') def chartdata3(): returnres = {"state": 200, "msg": "succsuful", "data": ""} datalist = [] reslist = {'date':['20191001', '20191002', '20191003', '20191004', '20191005', '20191006', '20191007'],'data':''} for i in range(0,7): datalist.append( { 'vue': random.randint(1, 500), 'wechat': random.randint(1, 500), 'ES6': random.randint(1, 500), 'Redis': random.randint(1, 500), 'React': random.randint(1, 500), 'springboot': random.randint(1, 500) }) reslist['data'] =datalist resdict = {'orderData': reslist} returnres["data"] = resdict return jsonify(returnres)