脫坑記錄--- removeEventListener 移除事件監聽失敗的經歷--vue--keep-alive-----完美實現echarts自適應屏幕~~~~


下面開始講述事情經過~~~~

頁面代碼是這樣的

<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>

完成~~~




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM