Skip to content

前言

很多时候我们后台管理系统可以收缩,然后就导致了图表变形的情况,这个时候我们就需要给图表加入自适应功能

Vue2自适应

引入第三方库

shell
npm i resize-detector@0.3.0
npm i lodash@4.17.21

新增mixins-resize.js

js
import { addListener, removeListener } from 'resize-detector';
import _ from 'lodash';

export default {
  mounted() {
    const { onResize } = this;
    this.__resizeHandler = _.debounce(() => {
      if (typeof onResize === 'function') onResize();
    }, 100);

    this.$nextTick(() => {
      addListener(this.$el, this.__resizeHandler);
    });
  },
  beforeDestroy() {
    removeListener(this.$el, this.__resizeHandler);
  }
}

在图表vue中使用

js
import ResizeMixins from '@/views/common/mixins-resize.js'
import echarts from 'echarts'

  mixins: [ResizeMixins],//混入和data同级
      
  methods: {
    //自适应分辨率
    onResize() {
      this.myChart && this.myChart.resize()   //myChart图表实例,就是渲染dom-id
      // this.$refs.swiper1 && this.$refs.swiper1.resize();
    },   
  }

详细可以查看Vue模板中的具体实现结果

Vue3自适应

组合式写法

js
import * as echarts from 'echarts'
import { useDebounceFn } from '@vueuse/core' //vue配置文件做了自动按需导入,这句可有可无

// 窗口自适应并开启过渡动画
const resize = () => {
  if (chart.value) {
    chart.value.resize({ animation: { duration: 300 } })
  }
}
// 自适应防抖优化
const debouncedResize = useDebounceFn(resize, 500, { maxWait: 800 })

onMounted(() => {
  initData()
  nextTick(() => {
    window.addEventListener('resize', debouncedResize)
  })
})

onBeforeUnmount(() => {
  if (chart.value) {
    chart.value.dispose()
    chart.value = null
    window.removeEventListener('resize', debouncedResize)
  }
})