el-table+echart+前端分页

115 阅读1分钟

需要在table里面加入柱状图,技术:el-table+echart+前端分页

问题难点:

难点在于因为是前端分页,所以刚开始数据是全部拿到的,而如果刚开始图表全部渲染出来,会导致除第一之外的数据,渲染的时候找不到要放置的dom,所以就需要把数据提前切割完成

实现如下图所示的效果

image.png

代码如下(省略部分代码)

                   <div class="tables">
                        <el-table border :data="currentData" stripe style="width: 100%">
                            <el-table-column :prop="tc" :label="tc" v-for="(tc,index) in tableColumn" :key="index">
                            </el-table-column>
                            <el-table-column label="count by reorderlevel" align='center'>
                                <template slot-scope="scope">
                                    <div style="height: 200px;" :id="'echarts'+scope.row.id"></div>
                                </template>
                            </el-table-column>
                        </el-table>
                        <el-pagination layout="prev, pager, next,sizes,jumper" :current-page="currentPage" :page-size="pageSize" :page-sizes="[5,10, 20, 50]" @size-change="handleSizeChanges" @current-change="handleCurrentChanges" :total="total" align='right' background style="margin-top:10px">
                        </el-pagination>
                    </div>
  handleSizeChanges (val) {
            this.currentPage = 1;
            this.pageSize = val;
            this.enrichedTablePage()
        },
        handleCurrentChanges (val) {
            this.currentPage = val;
            this.enrichedTablePage()
        },
        // 带图表表格
        enrichedTableType (resp) {
           
            //数据处理代码省略。。。
            this.enrichedTablePage()
        },
 pageDataFn (number, pageSize, data) {
            const pageData = [];
            let start = (pageSize * number) - pageSize;
            let end = pageSize * number;
            end = end > data.length ? data.length : end;
            for (let i = start; i < end; i++) {
                pageData.push(data[i])
            }
            return pageData;
        },
  enrichedTablePage () {
            this.currentData = this.pageDataFn(this.currentPage, this.pageSize, this.tableData)
            this.currentData.forEach((e) => {
                const options = {
                    tooltip: {
                        trigger: 'axis',
                        axisPointer: {
                            type: 'shadow'
                        }
                    },
                    xAxis: {
                        type: 'category',
                        data: e.rData,
                    },
                    yAxis: {
                        type: 'value'
                    },
                    series: [
                        {
                            data: e.cData,
                            type: 'bar'
                        }
                    ]
                };
                this.$nextTick(() => {
                    let percentChart = echarts.init(document.getElementById('echarts' + e.id));
                    percentChart.setOption(options);
                });
            });
        }