脱坑记录--- removeEventListener 移除事件监听失败的经历--vue--keep-alive-----完美实现echarts自适应屏幕~~~~

Posted sugartang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了脱坑记录--- 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>

完成~~~



以上是关于脱坑记录--- removeEventListener 移除事件监听失败的经历--vue--keep-alive-----完美实现echarts自适应屏幕~~~~的主要内容,如果未能解决你的问题,请参考以下文章

Docker 代理脱坑指南

Integer Cache(带你脱坑)

Beego脱坑(十三)ORM基本增删改查

数据库的脱坑之路

暗黑黎明苹果快用手游账号97级亲王号脱坑甩卖

前端脱坑日记之加载特效制作1