Echarts子组件封装以及多个Echarts子组件随窗口变化而变化!

1、目标效果

        源码在下方,复制并npm install echarts 便可运行

        将echarts封装成子组件,传入对应的option即可展示数据报表!

        

        随着窗口大小变化而改变数据报表大小!

                                                                        全屏

 ​

                                                            缩小窗口情况下 

  

2、封装echarts子组件

echarts使用三部曲:

(1)容器实例:        echart.init(document.getElementById(this.id));

(2)容器宽高                

(3)option配置         echart.setOption()

因此这三个就可以是父组件传给子组件的值,

 props: {
        id: {
            type: String,
            default: ''
        },
        options: {
            type: Object,
            default: () => {}
        },
        height: {
            type: Number,
            default: 300
        }
    },

        在mounted中创建实例

    mounted() {
        // 创建echarts实例并设置配置
        this.initCharts();
    },
    methods: {
        // 设置echarts配置项
        renderEchart() {
            this.myChart.setOption(this.options);
        },
        // 初始化图表
        initCharts() {
            this.myChart = echart.init(document.getElementById(this.id));
            this.renderEchart();
            // 页面大小变化重置图表
            window.addEventListener("resize", () => {
                this.myChart.resize();
            });
        }
    }

        在beforeDestroy中销毁实例

    beforeDestroy() {
        // 销毁echarts实例
        this.echarts = null
    },

3、源码

   /components/Echarts.vue

<template>
    <div :id="id" :style="{ 'height': height + 'px' }"></div>
</template>
 
<script>
import * as echart from 'echarts';
export default {
    props: {
        id: {
            type: String,
            default: ''
        },
        options: {
            type: Object,
            default: () => { }
        },
        height: {
            type: Number,
            default: 300
        }
    },
    data() {
        return {
            echarts: null
        }
    },
    watch: {
        // 监听配置项是否发生变化
        options: {
            handler(newVal, oldVal) {
                this.renderEchart();
            },
            deep: true
        },
    },
    mounted() {
        // 创建echarts实例并设置配置
        this.initCharts();
    },
    beforeDestroy() {
        // 销毁echarts实例
        this.echarts = null
    },
    methods: {
        // 设置echarts配置项
        renderEchart() {
            this.myChart.setOption(this.options);
        },
        // 初始化图表
        initCharts() {
            this.myChart = echart.init(document.getElementById(this.id));
            this.renderEchart();
            // 页面大小变化重置图表
            window.addEventListener("resize", () => {
                this.myChart.resize();
            });
        }
    }
}
</script>
 
<style scoped></style>

App.vue

<template>
  <div id="app">
    <!-- 柱状图 -->
    <div>
      <Echarts id="bar" :options="barOptiton" ref="barEchart"></Echarts>
    </div>
    <!-- 折线图 -->
    <div>
      <Echarts id="line" :options="lineOption" ref="lineEchart"></Echarts>
    </div>
  </div>
</template>
 
<script>
import Echarts from '@/components/Echarts'
export default {
  name: 'App',
  components: {
    Echarts
  },
  data() {
    return {
      lineOption: {
        title: {
          text: 'ECharts 折线图'
        },
        tooltip: {},
        xAxis: {
          data: ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子']
        },
        yAxis: {},
        series: [
          {
            name: '销量',
            type: 'line',
            data: [5, 20, 36, 10, 10, 20]
          }
        ]
      },
      barOptiton: {
        title: {
          text: 'ECharts 柱状图'
        },
        tooltip: {},
        xAxis: {
          data: ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子']
        },
        yAxis: {},
        series: [
          {
            name: '销量',
            type: 'bar',
            data: [5, 20, 36, 10, 10, 20]
          }
        ]
      }
    }
  },
}
</script>
 
<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
}
</style>

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值