<template> <view class="content"> <!-- #ifdef APP-PLUS || H5 --> <view class="top-Section"> <view class="title">{{title}}</view> <view class="rightBtn" @click="yesterdayCompare" v-if="isShowYesterDay"> <view class="rightName">昨日环比</view> <view class="rightIcon" :style="`border-color: ${fuzhuColor};`" v-if="isCompare"></view> <view class="rightIcon" style="background-color: #F4F7F7; border-color: #F4F7F7;" v-else></view> </view> </view> <view v-if="themeColor!=null" @click="echarts.onClick" :prop="option" :change:prop="echarts.updateEcharts" ref="chartId" :id="chartId" class="echarts"></view> <!-- #endif --> </view> </template> <script> import echarts from '../../static/echarts.js' export default { props: { themeColor: String, fuzhuColor: String, themeColor50: String, themeColor25: String, fuzhuColor50: String, chartId: String, title: String, dataList: Array, data1: Array, data2: Array, isShowYesterDay: { type: Boolean, default: false }, }, data() { return { // dataList: [], // data1: [], // data2: [], option: { tooltip: { trigger: 'axis', axisPointer: { type: 'line', lineStyle: { color: '#F1F5F9', // color: '#3CD9D9', type: 'dotted', width: 2 }, label: { backgroundColor: '#6a7985' }, }, extraCssText: 'z-index:50' }, grid: { left: '2%', right: '5%', bottom: 0, top: '10%', padding: 0, containLabel: true, }, // dataZoom: { // type: 'inside', // start: 0, // end: 30, // zoomLock: true, // }, xAxis: { type: 'category', boundaryGap: false, data: [], axisLabel: { //坐标轴刻度标签的相关设置。 margin: 10, textStyle: { color: '#616F88', fontFamily: 'Verdana', fontSize: 10 }, }, axisTick: { //坐标轴刻度相关设置。 show: false, }, axisLine: { //坐标轴轴线相关设置 show: false }, }, yAxis: { // show: false, type: 'value', splitNumber: 4, boundaryGap: false, axisTick: { show: false }, axisLine: { //坐标轴轴线相关设置 // show: false lineStyle: { color: '#707070', opacity: 0 } }, minInterval: 1, splitLine: { show: false } }, series: [{ name: '昨日', type: 'line', // stack: '总量', symbol: 'circle', symbolSize: 6, itemStyle: { opacity: 0, normal: { borderRadius: 3, color: this.fuzhuColor, borderWidth: 2, borderColor: '#FFF' }, }, areaStyle: { color: '' }, smooth: true, lineStyle: { color: '' }, data: [] }, { name: '当前', type: 'line', // stack: '总量', symbol: 'circle', symbolSize: 6, itemStyle: { opacity: 0, normal: { borderRadius: 3, color: '', borderWidth: 2, borderColor: '#FFF' }, }, areaStyle: { // color: '#56CBCB' color: '' }, smooth: true, lineStyle: { // color: '#fff', // type: 'dotted' }, data: [], } ] }, isCompare: false } }, methods: { getDataAction() { // var data1 = [] // var data2 = [] // var dataList = [] // for (var i = 0; i < 24; i++) { // var num1 = Math.ceil(Math.random() * 100) // var num2 = Math.ceil(Math.random() * 100) // data1.push(num1) // data2.push(num2) // dataList.push(i) // } // if (this.dataList.length <= 10) { // this.option.dataZoom.end = 100 // } else if (this.dataList.length > 10 && this.dataList.length <= 20) { // this.option.dataZoom.end = 70 // } else if (this.dataList.length > 20 && this.dataList.length <= 30) { // this.option.dataZoom.end = 20 // } else if (this.dataList.length > 30 && this.dataList.length <= 40) { // this.option.dataZoom.end = 15 // } else { // this.option.dataZoom.end = 10 // } this.option.series[1].data = this.data1 || [] if (this.isCompare) { this.option.series[0].data = this.data2 } else { this.option.series[0].data = [] } this.option.xAxis.data = this.dataList || [] // // console.log('数据刷新', this.option) // console.log('数据刷新Double', this.option) }, onViewClick(options) { // console.log(options) }, reloadColor() { // console.log('what???:', this.option.series) this.option.series[1].areaStyle.color = new echarts.graphic.LinearGradient(0, 0, 0, 1, [{ offset: 0, color: this.themeColor }, { offset: 1, color: this.themeColor25 }]) this.option.series[0].areaStyle.color = new echarts.graphic.LinearGradient(0, 0, 0, 1, [{ offset: 0, color: this.fuzhuColor50 }, { offset: 1, color: '#ffffff' }]) this.option.tooltip.axisPointer.lineStyle.color = this.themeColor this.option.series[0].lineStyle.color = this.fuzhuColor this.option.series[1].itemStyle.normal.color = this.themeColor this.option.series[0].itemStyle.normal.color = this.fuzhuColor }, yesterdayCompare() { this.isCompare = !this.isCompare if (this.isCompare) { this.option.series[0].data = this.data2 } else { this.option.series[0].data = [] } } }, watch: { chartId: { handler(e) { // // console.log('走没走!!!!', e) this.getDataAction() }, immediate: true }, themeColor: { handler(e) { // console.log('走没走!!!!', e) this.reloadColor() }, immediate: true }, data2: { handler(e) { this.getDataAction() }, immediate: true } } } </script> <script module="echarts" lang="renderjs"> let myChart export default { mounted() { this.initAction() }, methods: { initAction() { if (typeof window.echarts === 'function') { this.initEcharts() } else { // 动态引入较大类库避免影响页面展示 const script = document.createElement('script') // view 层的页面运行在 www 根目录,其相对路径相对于 www 计算 script.src = 'static/echarts.js' script.onload = this.initEcharts.bind(this) document.head.appendChild(script) } }, initEcharts() { // console.log("initEcharts -> this.$refs", this.$refs.chartId.$el.id) myChart = echarts.init(document.getElementById(this.$refs.chartId.$el.id)) // 观测更新的数据在 view 层可以直接访问到 if (myChart) { myChart.clear() myChart.setOption(this.option) } }, updateEcharts(newValue, oldValue, ownerInstance, instance) { // 监听 service 层数据变更 if (myChart) { myChart.clear() myChart.setOption(newValue) } }, onClick(event, ownerInstance) { // 调用 service 层的方法 ownerInstance.callMethod('onViewClick', { test: 'test' }) } } } </script> <style scoped lang="scss"> .content { width: 100%; height: 100%; // background-color: #FFFFFF; overflow: hidden; margin-bottom: 80rpx; .top-Section { padding: 0 20rpx; display: flex; flex-direction: row; justify-content: space-between; font-family: Verdana; .title { font-size: 32rpx; font-weight: bold; color: #383838; } .rightBtn { font-size: 24rpx; color: #546074; margin-top: 5rpx; display: flex; flex-direction: row; justify-content: flex-end; .rightName { margin-right: 12rpx; margin-top: 5rpx; } .rightIcon { width: 20rpx; height: 20rpx; border-radius: 50%; border: 10rpx solid; } } } .echarts { width: 100%; margin-top: 0; height: 350rpx; } } </style>