不知道大家使用echarts时是否遇到过当我们的窗口改变时,我们页面上的图表就缺失了一块,那一块被白色什么的所覆盖,图表没有实现实时的刷新,咋办呢?

技术要点: echarts里面的resize() + 节流

mounted() {
  // this.initEcharts 初始化图表
  this.initEcharts(this.type)
  // debounce 节流函数 下面送上
  this.__resizeHandler = debounce(() => {
    // this.myChart 所绘制的图表
    if (this.myChart) {
      this.myChart.resize()
    }
  }, 100)
  window.addEventListener('resize', this.__resizeHandler)
},
// 离开页面及时销毁
beforeDestroy() {
  if (!this.myChart) {
    return
  }
  window.removeEventListener('resize', this.__resizeHandler)
  this.myChart = null
},

 methods: {
    /**
    * @desc  初始化echarts实例
    */
    initEcharts(type) {
      this.myChart = echarts.init(document.getElementById(`resultEchart${this.identifier}${this.result.index}`))
      // 引入数据
      this.initResult(type)
      // 指定图表的配置项和数据
      const option = this.option
      // 使用刚指定的配置项和数据显示图表。
      this.myChart.setOption(option, true)
    },
 }   
节流函数

可以放公共组件里,可复用

/**
 * 函数节流
 * @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() {
    // 据上一次触发时间间隔
    const last = +new Date() - timestamp

    // 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait
    if (last < wait && last > 0) {
      timeout = setTimeout(later, wait - last)
    } else {
      timeout = null
      // 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用
      if (!immediate) {
        result = func.apply(context, args)
        if (!timeout) context = args = null
      }
    }
  }

  return function(...args) {
    context = this
    timestamp = +new Date()
    const callNow = immediate && !timeout
    // 如果延时不存在,重新设定延时
    if (!timeout) timeout = setTimeout(later, wait)
    if (callNow) {
      result = func.apply(context, args)
      context = args = null
    }

    return result
  }
}
防抖函数
/**
 * 函数防抖
 * @returns {Function}
 */
export const throttle = (function() {
  let timeout = 0
  return function(func, wait) {
    const the = this
    clearTimeout(timeout)
    timeout = setTimeout(() => {
      func.call(the)
    }, wait)
  }
}())
Logo

前往低代码交流专区

更多推荐