脱坑记录--- 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 ...
随机推荐
- 使用rsync向服务器迁移大文件
场景 本人将12G本地单文件(12G大小h5文件数据集)向Linux服务器进行大文件上传时传输失败.最初使用 scp 命令或 rsync 直接对大文件进行传输,会出现网络断开或服务器端管道破裂情况,而 ...
- vulnhub靶场之NOOB: 1
准备: 攻击机:虚拟机kali.本机win10. 靶机:NOOB: 1,网段地址我这里设置的桥接,所以与本机电脑在同一网段,下载地址:https://download.vulnhub.com/noob ...
- Rust Aya 编写 eBPF 程序
本文地址:https://www.ebpf.top/post/ebpf_rust_aya 1. 前言 Linux 内核 6.1 版本中有一个非常引人注意的变化:引入了对 Rust 编程语言的支持.Ru ...
- php 高并发
1 swoole的博客 http://rango.swoole.com/archives/508 2 消息队列 3 接口并发请求
- linux子网掩码修改记录
1.输入密码进入linux,并且进入root2.输入ifconfig.返回网卡信息,释:其中eno1为当前以太网名称.Inet IP/子网掩码位置数 Bcast广播地址 或者mask子网掩码3.修改子 ...
- python安装/环境变量配置/多版本共存
Python学习之路Day02: 一.今日学习内容概括: 计算机五大组成部分详解 计算机三大核心硬件 操作系统 编程与编程语言 编程语言的发展 编程语言分类 python解释器 Python Pyth ...
- 浏览器直接修改网站的js代码
1.按下F12打开控制台,找到源代码,然后是替换 2.在本地创建一个文件夹,会提示风险,点击允许 3.再找到你要修改的js文件代码,右击选择保存并覆盖 这样代码会保存到你刚刚创建的本地文件夹当中,接着 ...
- Google地图瓦片
1.Web墨卡托空间参考 1.1.什么是Web墨卡托 墨卡托投影,又称正轴等角圆柱投影,由荷兰地图学家墨卡托(G.Mercator)于1569年创拟.假设地球被套在一个圆柱中,赤道与圆柱相切,然后在地 ...
- 【Shell案例】【tail/head/sed、echo $res ·· cat和管道】2、打印文件的最后5行
描述经常查看日志的时候,会从文件的末尾往前查看,于是请你写一个 bash脚本以输出一个文本文件 nowcoder.txt中的最后5行示例:假设 nowcoder.txt 内容如下: #include& ...
- 【Hive】概念、安装、数据类型、DDL、DML操作、查询操作、函数、压缩存储、分区分桶、实战Top-N、调优(fetch抓取)、执行计划
一.概念 1.介绍 基于Hadoop的数据仓库工具,将结构化数据映射为一张表,可以通过类SQL方式查询 本质:将HQL转换成MapReduce程序 Hive中具有HQL对应的MapReduce模板 存 ...