VUE 單頁面使用 echart 窗口變化時的用法
在 VUE 項目中,為了使 echart 在窗口變化時能夠自適應(yīng),要用到 window.resize = function(){ .......};
但是我在項目剛開始的時間就有一個地方的高度變化使用了 window.resize ,在里面再次使用 會覆蓋掉原來的,所以在里面圖表使用時可以用
window.addEventListener('resize',this.resizeFu,false);
resixeFu 就是圖表變化時的方法
resizeFu(){
let div = document.getElementById('changeData');
if(div && this.changeData.DataTime.length>0){
this.chartsDiv.changeData.resize();
}
}
但里面有一個問題就是:每次進來當前頁面都會執(zhí)行 window.addEventListener
解決方法是在路由勾子函數(shù)中把它給去掉,方法是
beforeRouteLeave(to, from, next) {
//頁面走掉把事件給清除掉
window.removeEventListener("resize", this.resizeFu,false);
next()
},
補充知識:vue+echart圖表自適應(yīng)屏幕大小、點擊側(cè)邊欄展開收縮圖表自適應(yīng)大小resize
開發(fā)中用到了echart圖表,需要圖表自適應(yīng)大小resize,一開始使用的方法是:
window.onresize = function () {
this.myChart.resize();
};
但是又遇到一個問題,點擊側(cè)邊欄的展開收起的時候,圖表的大小沒有自適應(yīng)(因為窗口的大小沒有變化)
這里參考vue+element+admin的框架寫的自適應(yīng)

一、index.vue的文件
引入chart圖表``

這里是數(shù)據(jù)
chartData: {
title: {
text: '3-1(2)',
textStyle: {
color: '#979797',
fontSize: 14
}
},
tooltip: {
trigger: 'axis'
},
legend: {
icon: 'rect',
itemWidth: 4, // 圖例標記的圖形寬度
itemHeight: 11,
textStyle: {
lineHeight: 65,
fontSize: 14
},
data: ['郵件營銷', '聯(lián)盟廣告', '視頻廣告', '直接訪問', '搜索引擎']
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis: {
type: 'category',
boundaryGap: false,
data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
},
yAxis: {
type: 'value'
},
series: [
{
name: '郵件營銷',
type: 'line',
stack: '總量',
data: [0, 132, 101, 134, 90, 230, 210]
},
{
name: '聯(lián)盟廣告',
type: 'line',
stack: '總量',
data: [220, 12, 191, 234, 20, 330, 10]
},
{
name: '視頻廣告',
type: 'line',
stack: '總量',
data: [15, 232, 201, 154, 190, 330, 110]
},
{
name: '直接訪問',
type: 'line',
stack: '總量',
data: [320, 420, 301, 334, 60, 330, 320]
},
{
name: '搜索引擎',
type: 'line',
stack: '總量',
data: [820, 932, 901, 934, 1290, 1330, 1320]
}
]
}
二、chart.vue
<template>
<div :class="className" :style="{height:height,width:width}" />
</template>
<script>
import echarts from 'echarts'
import resize from './mixins/resize'
export default {
mixins: [resize],
props: {
className: {
type: String,
default: 'chart'
},
width: {
type: String,
default: '100%'
},
height: {
type: String,
default: '300px'
},
autoResize: {
type: Boolean,
default: true
},
chartData: {
type: Object,
required: true
}
},
data() {
return {
chart: null
}
},
watch: {
chartData: {
deep: true,
handler(val) {
this.setOptions(val)
}
}
},
mounted() {
this.$nextTick(() => {
this.initChart()
})
},
beforeDestroy() {
if (!this.chart) {
return
}
this.chart.dispose()
this.chart = null
},
methods: {
initChart() {
this.chart = echarts.init(this.$el, 'macarons')
this.setOptions(this.chartData)
},
setOptions(chartData) {
this.chart.setOption(chartData)
}
}
}
</script>
三、resize.js
import { debounce } from './debounce'
export default {
data() {
return {
$_sidebarElm: null
}
},
mounted() {
this.$_initResizeEvent()
this.$_initSidebarResizeEvent()
},
beforeDestroy() {
this.$_destroyResizeEvent()
this.$_destroySidebarResizeEvent()
},
// to fixed bug when cached by keep-alive
// https://github.com/PanJiaChen/vue-element-admin/issues/2116
activated() {
this.$_initResizeEvent()
this.$_initSidebarResizeEvent()
},
deactivated() {
this.$_destroyResizeEvent()
this.$_destroySidebarResizeEvent()
},
methods: {
// use $_ for mixins properties
// https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential
$_resizeHandler() {
return debounce(() => {
if (this.chart) {
this.chart.resize()
}
}, 100)()
},
$_initResizeEvent() {
window.addEventListener('resize', this.$_resizeHandler)
},
$_destroyResizeEvent() {
window.removeEventListener('resize', this.$_resizeHandler)
},
$_sidebarResizeHandler(e) {
if (e.propertyName === 'width') {
this.$_resizeHandler()
}
},
$_initSidebarResizeEvent() {
this.$_sidebarElm = document.getElementsByClassName('sidebar-container')[0]
this.$_sidebarElm && this.$_sidebarElm.addEventListener('transitionend', this.$_sidebarResizeHandler)
},
$_destroySidebarResizeEvent() {
this.$_sidebarElm && this.$_sidebarElm.removeEventListener('transitionend', this.$_sidebarResizeHandler)
}
}
}
四、debounce.js
/**
* @param {Function} func
* @param {number} wait
* @param {boolean} immediate
* @return {*}
*/
export function debounce(func, wait, immediate) {
let timeout, args, context, timestamp, result
const later = function() {
// 據(jù)上一次觸發(fā)時間間隔
const last = +new Date() - timestamp
// 上次被包裝函數(shù)被調(diào)用時間間隔 last 小于設(shè)定時間間隔 wait
if (last < wait && last > 0) {
timeout = setTimeout(later, wait - last)
} else {
timeout = null
// 如果設(shè)定為immediate===true,因為開始邊界已經(jīng)調(diào)用過了此處無需調(diào)用
if (!immediate) {
result = func.apply(context, args)
if (!timeout) context = args = null
}
}
}
return function(...args) {
context = this
timestamp = +new Date()
const callNow = immediate && !timeout
// 如果延時不存在,重新設(shè)定延時
if (!timeout) timeout = setTimeout(later, wait)
if (callNow) {
result = func.apply(context, args)
context = args = null
}
return result
}
}
以上這篇VUE 單頁面使用 echart 窗口變化時的用法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
前端Vue學(xué)習(xí)之購物車項目實戰(zhàn)記錄
購物車是電商必備的功能,可以讓用戶一次性購買多個商品,下面這篇文章主要給大家介紹了關(guān)于前端Vue學(xué)習(xí)之購物車項目的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-07-07

