diff --git a/src/views/dashboard/admin/components/BarChart.vue b/src/views/dashboard/admin/components/BarChart.vue index fa265ef6..be0af34f 100644 --- a/src/views/dashboard/admin/components/BarChart.vue +++ b/src/views/dashboard/admin/components/BarChart.vue @@ -5,11 +5,12 @@ <script> import echarts from 'echarts' require('echarts/theme/macarons') // echarts theme -import { debounce } from '@/utils' +import resize from './mixins/resize' const animationDuration = 6000 export default { + mixins: [resize], props: { className: { type: String, @@ -30,19 +31,14 @@ export default { } }, mounted() { - this.initChart() - this.__resizeHandler = debounce(() => { - if (this.chart) { - this.chart.resize() - } - }, 100) - window.addEventListener('resize', this.__resizeHandler) + this.$nextTick(() => { + this.initChart() + }) }, beforeDestroy() { if (!this.chart) { return } - window.removeEventListener('resize', this.__resizeHandler) this.chart.dispose() this.chart = null }, diff --git a/src/views/dashboard/admin/components/LineChart.vue b/src/views/dashboard/admin/components/LineChart.vue index 2e05102d..e654168d 100644 --- a/src/views/dashboard/admin/components/LineChart.vue +++ b/src/views/dashboard/admin/components/LineChart.vue @@ -5,9 +5,10 @@ <script> import echarts from 'echarts' require('echarts/theme/macarons') // echarts theme -import { debounce } from '@/utils' +import resize from './mixins/resize' export default { + mixins: [resize], props: { className: { type: String, @@ -32,8 +33,7 @@ export default { }, data() { return { - chart: null, - sidebarElm: null + chart: null } }, watch: { @@ -45,38 +45,21 @@ export default { } }, mounted() { - this.initChart() - if (this.autoResize) { - this.__resizeHandler = debounce(() => { - if (this.chart) { - this.chart.resize() - } - }, 100) - window.addEventListener('resize', this.__resizeHandler) - } - - // 监听侧边栏的变化 - this.sidebarElm = document.getElementsByClassName('sidebar-container')[0] - this.sidebarElm && this.sidebarElm.addEventListener('transitionend', this.sidebarResizeHandler) + this.$nextTick(() => { + this.initChart() + }) }, beforeDestroy() { if (!this.chart) { return } - if (this.autoResize) { - window.removeEventListener('resize', this.__resizeHandler) - } - - this.sidebarElm && this.sidebarElm.removeEventListener('transitionend', this.sidebarResizeHandler) - this.chart.dispose() this.chart = null }, methods: { - sidebarResizeHandler(e) { - if (e.propertyName === 'width') { - this.__resizeHandler() - } + initChart() { + this.chart = echarts.init(this.$el, 'macarons') + this.setOptions(this.chartData) }, setOptions({ expectedData, actualData } = {}) { this.chart.setOption({ @@ -146,10 +129,6 @@ export default { animationEasing: 'quadraticOut' }] }) - }, - initChart() { - this.chart = echarts.init(this.$el, 'macarons') - this.setOptions(this.chartData) } } } diff --git a/src/views/dashboard/admin/components/PieChart.vue b/src/views/dashboard/admin/components/PieChart.vue index ff1bc52c..4b54fc18 100644 --- a/src/views/dashboard/admin/components/PieChart.vue +++ b/src/views/dashboard/admin/components/PieChart.vue @@ -5,9 +5,10 @@ <script> import echarts from 'echarts' require('echarts/theme/macarons') // echarts theme -import { debounce } from '@/utils' +import resize from './mixins/resize' export default { + mixins: [resize], props: { className: { type: String, @@ -28,19 +29,14 @@ export default { } }, mounted() { - this.initChart() - this.__resizeHandler = debounce(() => { - if (this.chart) { - this.chart.resize() - } - }, 100) - window.addEventListener('resize', this.__resizeHandler) + this.$nextTick(() => { + this.initChart() + }) }, beforeDestroy() { if (!this.chart) { return } - window.removeEventListener('resize', this.__resizeHandler) this.chart.dispose() this.chart = null }, diff --git a/src/views/dashboard/admin/components/RaddarChart.vue b/src/views/dashboard/admin/components/RaddarChart.vue index de70e523..6823af31 100644 --- a/src/views/dashboard/admin/components/RaddarChart.vue +++ b/src/views/dashboard/admin/components/RaddarChart.vue @@ -5,11 +5,12 @@ <script> import echarts from 'echarts' require('echarts/theme/macarons') // echarts theme -import { debounce } from '@/utils' +import resize from './mixins/resize' const animationDuration = 3000 export default { + mixins: [resize], props: { className: { type: String, @@ -30,19 +31,14 @@ export default { } }, mounted() { - this.initChart() - this.__resizeHandler = debounce(() => { - if (this.chart) { - this.chart.resize() - } - }, 100) - window.addEventListener('resize', this.__resizeHandler) + this.$nextTick(() => { + this.initChart() + }) }, beforeDestroy() { if (!this.chart) { return } - window.removeEventListener('resize', this.__resizeHandler) this.chart.dispose() this.chart = null }, diff --git a/src/views/dashboard/admin/components/mixins/resize.js b/src/views/dashboard/admin/components/mixins/resize.js new file mode 100644 index 00000000..bcd17bf0 --- /dev/null +++ b/src/views/dashboard/admin/components/mixins/resize.js @@ -0,0 +1,56 @@ +import { debounce } from '@/utils' + +export default { + data() { + return { + $_sidebarElm: null + } + }, + mounted() { + this.$_initResizeEvent() + this.$_initSidebarResizeEvent() + }, + beforeDestroy() { + this.$_destroyResizeEvent() + this.$_destroySidebarResizeEvent() + }, + // to fixed bug when cached by keep-alive + // https://github.com/PanJiaChen/vue-element-admin/issues/2116 + activated() { + this.$_initResizeEvent() + this.$_initSidebarResizeEvent() + }, + deactivated() { + this.$_destroyResizeEvent() + this.$_destroySidebarResizeEvent() + }, + methods: { + // use $_ for mixins properties + // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential + $_resizeHandler() { + return debounce(() => { + if (this.chart) { + this.chart.resize() + } + }, 100)() + }, + $_initResizeEvent() { + window.addEventListener('resize', this.$_resizeHandler) + }, + $_destroyResizeEvent() { + window.removeEventListener('resize', this.$_resizeHandler) + }, + $_sidebarResizeHandler(e) { + if (e.propertyName === 'width') { + this.$_resizeHandler() + } + }, + $_initSidebarResizeEvent() { + this.$_sidebarElm = document.getElementsByClassName('sidebar-container')[0] + this.$_sidebarElm && this.$_sidebarElm.addEventListener('transitionend', this.$_sidebarResizeHandler) + }, + $_destroySidebarResizeEvent() { + this.$_sidebarElm && this.$_sidebarElm.removeEventListener('transitionend', this.$_sidebarResizeHandler) + } + } +}