echarts多个图表渲染不显示(避坑)

428 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第8天,点击查看活动详情

image.png

如图所示,左右两边是两个数组图表渲染,需要给唯一的ref和id,每次更新数据时需要调用对应的图表方法(本文中的图表是封装成第三方组件调用)

直接看代码: 子组件(封装后的echarts)

<template>
    <div>
        <div class="columnx_container">
                <div
                        class="left_chart"
                        :id="id"
                        :class="className"
                        :chartData="chartData"
                        :style="{ height: height, width: width }"
                />
                <div class="right_icon_delay" v-if="type == '延期'">
                        <p :style="{ fontSize: scalFontSize }">+{{ chartData.currentDelayDays }}</p>
                        <p>延期</p>
                </div>
                <div class="right_icon_ontime" v-if="type == '准点'">
                        <p :style="{ fontSize: scalFontSize }">-{{ chartData.currentDelayDays }}</p>
                        <p>准点</p>
                </div>
        </div>
        <p class="legend_like">
                <span></span>
                合同评审
                <span></span>
                生产准备
                <span></span>
                生产制造
                <span></span>
                订单节点
        </p>
        <no-data v-if="noData" class="noDataCls"></no-data>
    </div>
</template>
        initChart(data) {
                if (data.noData) {
                        this.noData = true
                        return
                }
                this.destoryChart()
                this.noData = false
                let { seriesData } = data
                const num = seriesData.currentDelayDays.toString()
                if (num.length > 4) {
                        this.scalFontSize = '14px'
                } else {
                        this.scalFontSize = null
                }
                this.chart = echarts.init(document.getElementById(this.id))
                this.chart.setOption(
                        {
                                tooltip: {
                                        trigger: 'axis'
                                },
                                grid: {
                                        left: '3%',
                                        right: '4%',
                                        top: '20',
                                        bottom: '20',
                                        containLabel: true
                                },
                            
                                xAxis: {
                                        type: 'value'
                                },

                                yAxis: {
                                        type: 'category',
                                        data: ['实际交付周期', '计划交付周期']
                                },
                                series: [
                                        {
                                                name: '合同评审',
                                                type: 'bar',
                                                barWidth: 15, //柱状宽度
                                                itemStyle: {
                                                        //柱状颜色和圆角
                                                        color: '#6B89E9',
                                                        barBorderRadius: [4] // (顺时针左上,右上,右下,左下)
                                                },
                                                stack: 'total',
                                                data: seriesData.orderDataX.contractReview,

                                                // 订单节点值与位置显示
                                                markPoint: {
                                                        data: [{ value: 6, xAxis: seriesData.orderNodeT, yAxis: 0 }],
                                                        label: {
                                                                color: 'transparent' // 隐藏文字
                                                        },
                                                        symbol: 'image://' + require('../../assets/imgs/angle.png'),
                                                        symbolSize: [18, 18], // 调整图片的长宽
                                                        symbolOffset: [0, '60%'] // 调整标注图片的位移方向 大小
                                                }
                                        },
                                        {
                                                name: '生产准备',
                                                type: 'bar',
                                                barWidth: 15,
                                                itemStyle: {
                                                        color: '#FCBF63',
                                                        barBorderRadius: [4]
                                                },
                                                stack: 'total',
                                                data: seriesData.orderDataX.productionPreparation
                                        },
                                        {
                                                name: '生产制造',
                                                type: 'bar',
                                                barWidth: 15,
                                                itemStyle: {
                                                        color: '#3ED473',
                                                        barBorderRadius: [4]
                                                },
                                                stack: 'total',
                                                data: seriesData.orderDataX.manufacturing
                                        }
                                ]
                        },
                        true
                )
        }

父组件:

html中循环:

        <div class="ontime_order">
                        <div
                            v-for="(item, index) in ontimeOrderList"
                            :key="index"
                            @click="goOrderDetail(item, '准点')"
                            style="cursor: pointer">
                            <div class="condition_sch">
                                    <div class="condition_sch_left">{{ item.contractNum }}交付预测周期分析</div>
                                    <div class="condition_sch_right export_icon">
                                        <el-button
                                                :disabled="disSave2"
                                                class="resetBtn btn"
                                                plain
                                                @click.stop="saveColumnXImg(item.chartId, `${item.contractNum}交付预测周期分析`)"
                                        >
                                                <svg-icon class="icon" icon-class="export" />
                                        </el-button>
                                    </div>
                                </div>
                                <div>
                                    <column-x
                                            :ref="item.contractNum"
                                            type="准点"
                                            :id="item.chartId"
                                            :chartData="item"
                                            width="100%"
                                    ></column-x>
                                </div>
                            </div>
                        </div>

获取到数据后,触发对应图表方法(注意refs的写法)

console.log('准时列表', this.ontimeOrderList)
    this.$nextTick(() => {
            this.ontimeOrderList.forEach(item => {
                this.$refs[item.contractNum][0].initChart({
                        seriesData: item,
                        noData: !item
                })
            })
    })