脱坑记录--- 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自适应屏幕~~~~的更多相关文章
- 记一次使用 removeEventListener 移除事件监听失败的经历
测试一 测试代码如下 var Test = function() { this.element = document.body; this.handler = function() { console ...
- [No00006A]Js的addEventListener()及attachEvent()区别分析【js中的事件监听】
1.添加时间监听: Chrom中: addEventListener的使用方式: target.addEventListener(type, listener, useCapture); target ...
- Javascript事件监听
FireFox : addEventListener()方法 IE : attachEvent()方法 为HTML元素添加一个事件监听, 而不是直接对元素的事件属性(如:onclick.onmouse ...
- 关于vue事件监听的一个问题
由于新工作需要用vue,所以最近接触最多的也是vue,因为之前一直在用react,所以对于vue上手还是很快的.我也尽量找一些他们两个的异同点,除了多了一些辅助用的方法以外,最大的不同应该是对于组件间 ...
- 事件监听addEventListener()和removeEventListener() ---------1
一直想写一个原生事件监听的记录,方便以后看,不愿意写主要是事件监听的单词太长,记起来好难记每次都要查,这次把知道的写完了,来这里查好了,以后要是理解的更透彻了,就再补全好了 首先,DOM0级事件和DO ...
- taro 填坑之路(二)taro 通过事件监听 实现组件间传值
1.组件传值的方式 2.事件监听原理 3.事件管理器 utils/event.js /** * 事件池(事件管理器) * 通过事件监听传值 */ class Event { constructor() ...
- [JS]笔记12之事件机制--事件冒泡和捕获--事件监听--阻止事件传播
-->事件冒泡和捕获-->事件监听-->阻止事件传播 一.事件冒泡和捕获 1.概念:当给子元素和父元素定义了相同的事件,比如都定义了onclick事件,点击子元素时,父元素的oncl ...
- JS 中的事件绑定、事件监听、事件委托
事件绑定 要想让 JavaScript 对用户的操作作出响应,首先要对 DOM 元素绑定事件处理函数.所谓事件处理函数,就是处理用户操作的函数,不同的操作对应不同的名称. 在JavaScript中,有 ...
- JS通用事件监听函数
JS通用事件监听函数 版本一 //把它全部封装到一个对象中 var obj={ readyEvent:function (fn){ if(fn==null){ fn=document; } var o ...
- 从jQuery的缓存到事件监听
不知道大家有没有发现,用jQuery选择器"选择"之后的DOM上会添加jQuery*********属性. <DIV id=d1 jQuery1294122065250=&q ...
随机推荐
- C++算法之旅、02 从木棒切割问题领悟二分法精髓
172.木棒切割问题 https://sunnywhy.com/problem/172 题目描述 给出n根木棒的长度,现在希望通过切割它们来得到至少k段长度相等的木棒(长度必须是整数),问这些长度相等 ...
- Java 编码那些事(二)
建议先阅读:Java 编码那些事(一) 现在说说编码在Java中的实际运用.在使用tomcat的时候,绝大部分同学都会遇到乱码的问题,查查文档,google一下解决方案啥的,都是设置这里,设置那里,或 ...
- 嵌入式-Linux基础操作
Crtl+Alt+T:调出命令窗口 xrandr:列出分辨率列表 设置窗口的分辨率大小为1280x960:xrandr -s 1280x960 通过命令窗口来执行一段C语言程序: VI工具的使用: ( ...
- 【DL论文精读笔记】ResNet
Abstract 利用残差学习架构释放深度 152层深度是VGG的8倍,且复杂度更低 ImageNet上的错误率3.57% 在ILSVRC和2015COCO竞赛,在多项任务拿到第一 3.1 Intro ...
- css属性样式整合
font-size 字体大小 常用色值:#000 黑色:#fff 白色:#ccc.#333.#2f2f2f.#666.#ddd 灰色: rgb表示法:color:rgb(255,255,255); r ...
- php中的try语句
为了进一步处理异常,我们需要使用try-catch语句----包括Try语句和至少一个的catch语句.任何调用 可能抛出异常的方法的代码都应该使用try语句.Catch语句用来处理可能抛出的异常.以 ...
- ES文件传输助手1.0.0
软件下载地址 1.软件功能 与 ES文件浏览器 的快传功能 直接传输文件 支持接受文件点击预览 可以多台电脑使用该软件,从而实现电脑与电脑局域网互传文件 单个文件夹上传会递归上传该文件夹下所有文件夹与 ...
- 关于小米mini路由器开启ssh红灯解决
前言 小米 后续版本 对 ssh固件校验失败导致的,下载路由器旧版开发版固件,然后用后台web升级成老版本后,再采用官方方法刷入即可. 旧版路由器固件下载 地址 其他 后续的刷机可以参考我的文章
- orcl substr函数与java substring 的不同
前天事情急改一个存储过程时遇到了substr方法时,一直用好,然后用其他方法跳过去了,今天有时间回头来验证 才发现和java太不一样了! select substr('为中华之崛起而读书',2,4) ...
- 【Java SE】Day09 继承、super、this、抽象类
一.继承 1.概述 多个类具有相同属性和行为,共性抽取到一个类中(父类) 父类更通用,子类更具体 2.继承后的成员变量 本类:this.成员变量名 父类:super.成员变量名 3.继承后的成员方法 ...