脱坑记录--- 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>

完成~~~



原文地址:https://www.cnblogs.com/sugartang/p/12539587.html

时间: 2024-08-06 14:44:46

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

Javascript 的事件监听函数和移除事件监听函数

<html> <head></head> <body> <div id="hello">hello world</div> <script> //w3c中使用addEventListener()函数监听事件,IE中使用attachEvent()函数监听事件 //w3c中使用 removeEventListener ()函数移除事件监听,IE中使用detachEvent()函数来移除事件监听 var do

js如何实现事件监听和解决兼容性

一.为什么需要事件监听? 我们可不可以为同一对象的同一事件绑定多个事件处理程序呢? 通过行内绑定和动态绑定是不可以的,但是可以通过事件监听来实现. window.onload = function() { // 动态绑定 document.getElementById('btn').onclick = function() { alert('first'); } // 动态绑定 document.getElementById('btn').onclick = function() { alert

关于vue事件监听的一个问题

由于新工作需要用vue,所以最近接触最多的也是vue,因为之前一直在用react,所以对于vue上手还是很快的.我也尽量找一些他们两个的异同点,除了多了一些辅助用的方法以外,最大的不同应该是对于组件间的通信,不仅有props,还有一种事件监听,也是可以通过组件间传递的.我们知道vue的事件监听是一个很方便的设计,代码上一目了然,而且给我们增加了多种修饰符(虽然我都没怎么用过)来简化你的代码.可归根结底,所谓事件监听,通常都是一个需要预处理的过程,即在你初始化你的实例时就需要去为其注册监听.这当然

事件监听addEventListener()和removeEventListener() ---------1

一直想写一个原生事件监听的记录,方便以后看,不愿意写主要是事件监听的单词太长,记起来好难记每次都要查,这次把知道的写完了,来这里查好了,以后要是理解的更透彻了,就再补全好了 首先,DOM0级事件和DOM2级事件 给一个元素添加事件有三种方法 HTML <input type="button" value='button1' id='btn1' /><input type="button" value='button2' id='btn2' />

JavaScript-4.5 事件大全,事件监听---ShinePans

绑定事件 <input type="bubtton" onclick="javascript:alert('I am clicked');"> 处理事件 <script language="JavaScript" for="对象" event="事件"> ... (事件处理代码) ... </script> 鼠标事件举例 <script language="

(12)JavaScript之[事件][事件监听]

事件 1 /** 2 * 事件: 3 * onload 和 onunload 事件在用户进入或离开页面时被触发 4 * 5 * onchange事件常结合对输入字段的验证来使用 6 * onmouseover 和 onmouseout 事件可用于在用户的鼠标移至 HTML 元素上方或移出元素时触发函数. 7 * 8 * onmousedown, onmouseup 以及 onclick 构成了鼠标点击事件的所有部分.首先当点击鼠标按钮时, 9 * 会触发 onmousedown 事件,当释放鼠标

JS 事件绑定、事件监听、事件委托详细介绍

事件绑定 要想让 JavaScript 对用户的操作作出响应,首先要对 DOM 元素绑定事件处理函数.所谓事件处理函数,就是处理用户操作的函数,不同的操作对应不同的名称. 在JavaScript中,有三种常用的绑定事件的方法: 在DOM元素中直接绑定: 在JavaScript代码中绑定: 绑定事件监听函数. 在DOM中直接绑定事件 我们可以在DOM元素上绑定onclick.onmouseover.onmouseout.onmousedown.onmouseup.ondblclick.onkeyd

JS 中的事件绑定、事件监听、事件委托

事件绑定 要想让 JavaScript 对用户的操作作出响应,首先要对 DOM 元素绑定事件处理函数.所谓事件处理函数,就是处理用户操作的函数,不同的操作对应不同的名称. 在JavaScript中,有三种常用的绑定事件的方法: 在DOM元素中直接绑定: 在JavaScript代码中绑定: 绑定事件监听函数. 在DOM中直接绑定事件 我们可以在DOM元素上绑定onclick.onmouseover.onmouseout.onmousedown.onmouseup.ondblclick.onkeyd

js事件监听

通过添加事件监听进一步实现业务处理.可以对同一个元素添加相同的事件监听,执行会从上到下的原则,也可以添加多个事件监听针对同一元素. 针对元素监听: document.getElementById("idName").addEventListener("eventType",functionName);//注意:前面不加on 如click事件 针对window对象监听: window.addEventListener(“resize”,function(){ aler