echart组件复用

本文介绍如何创建一个名为lineEcharts的ECharts图表组件,以便在多个地方复用。首先,我们详细展示了如何在Vue.js应用中创建这个组件。接着,父组件通过导入子组件并传递必要的数据来调用它。组件的复用性和灵活性使得我们可以方便地从后台获取数据并动态构建图表。最后,文章提供了一个父组件的完整代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、创建echarts组件,用于复用
lineEcharts.vue

<template>
    <div :id="id" style="height: 100%"></div>
</template>

<script>
  import echarts from 'echarts'
  export default {
    name: "lineEchart",
    data () {
      return {

      }
    },
    props: ['id','lineData'],
    mounted() {
      this.$nextTick(()=>{
        this.myChart = echarts.init(document.getElementById(this.id),'shine');
        this.initData()
      })
    },
    methods: {
      initPieCharts () {
        let vm = this;
        let o = vm.lineData;
        const option = {
          tooltip: {
            trigger: 'axis',
          },
          xAxis: {
            name: '风速(m/s)',
            type: 'category',
            boundaryGap: false,
            data: [2.5,3.5,4.5,5.5,6.5,7.5,8.5,9.5,10.5,11.5,12.5,13.5,14.5,15.5,16.5,17.5,18.5,19.5,20.5,21.5,22.5,23.5,24.5],
          },
          yAxis: {
            name: '湍流强度',
            type: 'value',
          },
          series: o && o.map((v)=>{
            return Object.assign({
              smooth: true,
            },v)
          }) || []
        };
        this.myChart.setOption(option);
      },
      initData() {
        this.initPieCharts()
      },
    },
    watch: {
      lineData: function(){
        this.initData()
      }
    }
  }
</script>

<style scoped></style>

2、父组件中调用echarts组件
1)引入echarts子组件

import lineEchart from '@/components/echarts/lineEchart'
components: {lineEchart},
  1. 定义需要传入的数据
boxList: [
          {label: "M值湍流图", name: 'lineOnflow', data: {}},
          {label: "扇区管理后M值湍流", name: 'lineAftOnflow', data: {}},
          {label: "ETM极端湍流", name: 'lineETM', data: {}},
          {label: "扇区管理后ETM极端湍流", name: 'lineAfterETM', data: {}},
        ],

3)组件的复用

<el-row :gutter="100">
      <el-col :span="12">
        <h3 class="title">{{item.label}}</h3>
        <line-echart :ref="'echart'+index" :id="item.name" :lineData="item.data" class="chart-item" :lineData.sync="item.data || null"></line-echart>
      </el-col>
    </el-row>

4)从后台拿到数据,构建数据

analysisData () {
        Https.analysis().then((res) => {
          if(res.data) {
            vm.$set(vm.boxList, 0, Object.assign(vm.boxList[0], {data: res.data.mturbLine}))
            vm.$set(vm.boxList, 1, Object.assign(vm.boxList[1], {data: res.data.mmanageTurbLine}))
            vm.$set(vm.boxList, 2, Object.assign(vm.boxList[2], {data: res.data.etmTurbLine}))
            vm.$set(vm.boxList, 3, Object.assign(vm.boxList[3], {data: res.data.etmManageTurbLine}))
            vm.refreshEcharts();
          }
        }).catch((err => {
          console.log(err)
        }))
      },
       refreshEcharts () {
        for (let i in this.boxList) {
          if(this.$refs['echart' + i]){
            this.$refs['echart' + i][0].initData();
          }
        }
      },

效果图:
在这里插入图片描述
父组件完整代码:

<template>
  <div class="home">
    <el-row :gutter="100">
      <el-col :span="12">
        <h3 class="title">{{item.label}}</h3>
        <line-echart :ref="'echart'+index" :id="item.name" :lineData="item.data" class="chart-item" :lineData.sync="item.data || null"></line-echart>
      </el-col>
    </el-row>
  </div>
</template>

<script>
  import lineEchart from '@/components/echarts/lineEchart'

  let Https = new https()
  export default {
    data() {
      return {
        boxList: [
          {label: "M值湍流图", name: 'lineOnflow', data: {}},
          {label: "扇区管理后M值湍流", name: 'lineAftOnflow', data: {}},
          {label: "ETM极端湍流", name: 'lineETM', data: {}},
          {label: "扇区管理后ETM极端湍流", name: 'lineAfterETM', data: {}},
        ],
      }
    },
    components: {lineEchart},
    mounted () {
      this.analysisData();
    },
    methods: {
      analysisData () {
        Https.analysis().then((res) => {
          if(res.data) {
            vm.$set(vm.boxList, 0, Object.assign(vm.boxList[0], {data: res.data.mturbLine}))
            vm.$set(vm.boxList, 1, Object.assign(vm.boxList[1], {data: res.data.mmanageTurbLine}))
            vm.$set(vm.boxList, 2, Object.assign(vm.boxList[2], {data: res.data.etmTurbLine}))
            vm.$set(vm.boxList, 3, Object.assign(vm.boxList[3], {data: res.data.etmManageTurbLine}))
            vm.refreshEcharts();
          }
        }).catch((err => {
          console.log(err)
        }))
      },
      refreshEcharts () {
        for (let i in this.boxList) {
          if(this.$refs['echart' + i]){
            this.$refs['echart' + i][0].initData();
          }
        }
      },
    }
  }
</script>
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值