下面開始講述事情經過~~~~
頁面代碼是這樣的
<template> <page-view :title="title"> <div id="myChart" ref="mapBox" style="width: 100%; height: 500px"></div> </page-view> </template> <script> import { PageView } from '@/layouts' import echarts from 'echarts' // 設置圖表基礎配置項和數據 const myOption = { title: { text: 'XXX', link: 'http://localhost:8000/', subtext: 'XXXXXXX' }, // title: { // text: '折線圖堆疊' // }, tooltip: { trigger: 'axis' }, legend: { data: ['郵件營銷', '聯盟廣告', '視頻廣告', '直接訪問', '搜索引擎'] }, grid: { left: '3%', right: '4%', bottom: '3%', containLabel: true }, toolbox: { feature: { saveAsImage: {} } }, xAxis: { type: 'category', boundaryGap: false, data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日'] }, yAxis: { type: 'value' }, series: [ { name: '郵件營銷', type: 'line', stack: '總量', data: [120, 132, 101, 134, 90, 230, 210] }, { name: '聯盟廣告', type: 'line', stack: '總量', data: [220, 182, 191, 234, 290, 330, 310] }, { name: '視頻廣告', type: 'line', stack: '總量', data: [150, 232, 201, 154, 190, 330, 410] }, { name: '直接訪問', type: 'line', stack: '總量', data: [320, 332, 301, 334, 390, 330, 320] }, { name: '搜索引擎', type: 'line', stack: '總量', data: [820, 932, 901, 934, 1290, 1330, 1320] } ] } export default { components: { PageView }, data() { return {} }, mounted() { // 初始化echarts實例 this.myChart = echarts.init(this.$refs.mapBox) // 設置圖表的配置項和數據 this.getData() // 設置圖表自定義縮放 window.addEventListener('resize', this.resizeTheChart) // window.addEventListener('resize', this.resizeTheChart, false) }, methods: { // 獲取數據,設置圖表配置項和數據1 getData() { // const list = [{},{}] // myOption.series = list this.myChart.setOption(myOption) }, // 獲取數據,設置圖表配置項和數據2 // 設置圖表自定縮放1 resizeTheChart() { console.log('縮放執行中~~~') if (this.$refs && this.$refs.mapBox) { const myChartNode = document.getElementById('myChart') if (myChartNode) { myChartNode.style.height = myChartNode.offsetWidth * 0.6 + 'px' } this.myChart.resize() } } // 設置圖表自定縮放2 }, computed: { title() { return this.$route.meta.title } }, beforeDestroy() { window.removeEventListener('resize', this.resizeTheChart) // window.removeEventListener('resize', this.resizeTheChart, false) } } </script>
問題來了:
進入組件后,切換其他組件,resize事件一直是存在的,沒有被銷毀,
我先是懷疑自己應該給添加和移除事件添加第三個屬性,
我試了一下,沒卵用
然后開始瘋狂谷歌搜索
未果~~~~~
別人也是這樣寫的,人家的都有用,就我的沒用
然后我給
beforeDestroy
添加了一個打印,再切換頁面,發現打印未執行
我就知道了~~
原來是壓根沒用執行
beforeDestroy
好了
結局來了
因為使用的是原有的框架
使用keep-alive包裹動態組件時,會緩存不活動的組件實例,而不是銷毀它們。
當頁面切換的時候
被包含的組件保留狀態,沒有被重新渲染。
使用緩存后,組件只掛載一次,永遠不注銷
必須使用激活和凍結,代理掛載和注銷~~~
activated(){} // 激活 deactivated(){} // 凍結
然后修改代碼如下
<template> <page-view :title="title"> <div id="myChart" ref="mapBox" style="width: 100%; height: 500px"></div> </page-view> </template> <script> import { PageView } from '@/layouts' import echarts from 'echarts' // 設置圖表基礎配置項和數據 const myOption = { title: { text: 'xxxx', link: 'http://localhost:8000/', subtext: 'xxxx' }, // title: { // text: '折線圖堆疊' // }, tooltip: { trigger: 'axis' }, legend: { data: ['郵件營銷', '聯盟廣告', '視頻廣告', '直接訪問', '搜索引擎'] }, grid: { left: '3%', right: '4%', bottom: '3%', containLabel: true }, toolbox: { feature: { saveAsImage: {} } }, xAxis: { type: 'category', boundaryGap: false, data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日'] }, yAxis: { type: 'value' }, series: [ { name: '郵件營銷', type: 'line', stack: '總量', data: [120, 132, 101, 134, 90, 230, 210] }, { name: '聯盟廣告', type: 'line', stack: '總量', data: [220, 182, 191, 234, 290, 330, 310] }, { name: '視頻廣告', type: 'line', stack: '總量', data: [150, 232, 201, 154, 190, 330, 410] }, { name: '直接訪問', type: 'line', stack: '總量', data: [320, 332, 301, 334, 390, 330, 320] }, { name: '搜索引擎', type: 'line', stack: '總量', data: [820, 932, 901, 934, 1290, 1330, 1320] } ] } export default { components: { PageView }, data() { return {} }, mounted() { // 初始化echarts實例 this.myChart = echarts.init(this.$refs.mapBox) // 設置圖表的配置項和數據 this.getData() }, methods: { // 獲取數據,設置圖表配置項和數據1 getData() { // const list = [{},{}] // myOption.series = list this.myChart.setOption(myOption) }, // 獲取數據,設置圖表配置項和數據2 // 設置圖表自定縮放1 resizeTheChart() { console.log('縮放執行中~~~') if (this.$refs && this.$refs.mapBox) { const myChartNode = document.getElementById('myChart') if (myChartNode) { myChartNode.style.height = myChartNode.offsetWidth * 0.6 + 'px' } this.myChart.resize() } }, // 設置圖表自定縮放2 }, computed: { title() { return this.$route.meta.title } }, activated() { // 設置圖表自定義縮放 window.addEventListener('resize', this.resizeTheChart) }, deactivated() { window.removeEventListener('resize', this.resizeTheChart) } } </script>
完成~~~