echarts柱状图自定义分页下标

开发背景:亿信华辰

实现效果

 

 主要就是加了分页图标,根据页码渲染柱状图的时候给该页的条数 (用到了slice) ,然后监听小箭头点击事件,刷新图表数据,更改箭头颜色。

html

<div style="overflow:visible;width:300px;">
    <div id="main" style="width:100%;height:100%;"></div>
    <div id="paginationContainer" class="pagination">
		<button id="prev" disabled><div class="arrow leftArrow disabledArrow"></div></button>
        <span id="pageInfo" style="color:#DEF1FF">1 / 2</span>
        <button id="next"><div class="arrow rightArrow"></div></button>
    </div>
</div>

  

js 

var myChart = null;
var myData = null;
var myProperty = null;
// 每页显示的数据数量
var pageSize = 5;
// 当前页码
var currentPage = 1;
// 总页数
var pageCount = 0;
/*
 * 初始化方法
 *
 * @params cwidget 组件对象
 * @params vardata 取数定义中定义的变量,json格式:{'var1':'xxx'}
 * @params storagedata 组件自己需要存储的值,字符串格式
 * @params events 事件,用户在右边属性上设置的事件, json格式:{'evt1': function(){...}, 'evt2':function(){....}}
 * @params resources 资源及权限校验,json格式:{'resids': ['EBI$12$xxx$1$xxx.rpttpl','EBI$12$xxx$1$xxx.coolrpt'], 'pms': [true, false]}
 */
function init(cwidget, vardata, events, storagedata, resources) {
    if (!window["CoolUtil"]) {
        EUI.include(EUI.getContextPath() + "ecoolvwidgetmgr/htmlwidgeteditor/tool/coolutil.js");
    }
    cwidget.setUniqueID(CoolUtil.getUniqueId('05qq90512344bqw977c39998a04a9ad', cwidget));
    var basedom = cwidget.basedom; 
    getValue(cwidget);
    initMyData(vardata);
    initMyChart(basedom);
    reloadMyChart();
    if(cwidget.isresultview){
        cwidget.refresh = function(cwidget, vardata){
            refreshDatas(cwidget, vardata);
        }
        //只在结果界面的时候执行,例如只想在结果界面绑定click事件
    }
}

function initMyChart(basedom) {
    if (myChart) return;
    if (!window['echarts']) {
        EUI.include("vfs/root/products/ebi/sys/coolrpt/coolresource/js/third/echarts5.min.js");
    }
   // 初始化图表
   myChart = echarts.init(document.getElementById('main'));
}

function reloadMyChart(basedom) {
    // 总页数
    pageCount = Math.ceil(myData.xData.length / pageSize);

    document.getElementById('pageInfo').innerText = `${currentPage} / ${pageCount}`;

    // 初始加载图表
    updateChart();
    // 动态生成分页控件HTML
    if (myData.yDataBar.length > pageSize) {
        document.getElementById('paginationContainer').innerHTML = `
            <button id="prev" disabled><div class="arrow disabledArrowLeft"></div></button>
            <span id="pageInfo" style="color:#DEF1FF;font-size:14px;">1 / ${pageCount}</span>
            <button id="next"><div class="arrow rightArrow"></div></button>
        `;
        // 添加分页按钮事件监听器
        document.getElementById('prev').addEventListener('click', function() {
            if (currentPage > 1) {
                currentPage--;
                updateChart();
            }
        });

        document.getElementById('next').addEventListener('click', function() {
            if (currentPage < pageCount) {
                currentPage++;
                updateChart();
            }
        });
    } else {
        document.getElementById('paginationContainer').innerHTML = '';
    }

}

function updateChart() {
    var option = getMyOption();
    myChart.setOption(option);
    document.getElementById('pageInfo').innerText = `${currentPage} / ${pageCount}`;
    
    // 更新分页按钮的状态
    updatePaginationButtons();
}

function getMyOption() {
    if (myProperty.pageSize) {
        pageSize = myProperty.pageSize;    
    }
   var start = (currentPage - 1) * pageSize;
   var end = Math.min(start + pageSize, myData.yDataBar.length);
   var option = {
        "grid": {
            "top": myProperty.gridTop,
            "bottom": myProperty.gridBottom,
            "left": myProperty.gridLeft,
            "right": myProperty.gridRight,
        },
        "tooltip": getToolTip(),
        "xAxis": getXaxis(start, end),
        "yAxis": getYAxis(start, end),
        "series": getSeries(start, end)
    }
   
    return option;
}

function updatePaginationButtons() {
    var prevButton = document.getElementById('prev');
    var nextButton = document.getElementById('next');
    var prevArrow = prevButton.querySelector('.arrow');
    var nextArrow = nextButton.querySelector('.arrow');

    if (currentPage === 1) {
        prevButton.disabled = true;
        prevArrow.classList.remove('leftArrow');
        prevArrow.classList.add('disabledArrowLeft');
    } else {
        prevButton.disabled = false;
        prevArrow.classList.add('leftArrow');
        prevArrow.classList.remove('disabledArrowLeft');
    }

    if (currentPage === pageCount) {
        nextButton.disabled = true;
        nextArrow.classList.remove('rightArrow');
        nextArrow.classList.add('disabledArrowRight');
    } else {
        nextButton.disabled = false;
        nextArrow.classList.add('rightArrow');
        nextArrow.classList.remove('disabledArrowRight');
    }
}
function getSeries(start, end) {
    var series = [];    
    getBarSeries(series,start, end);
    getLineSeries(series,start, end);
    getPointSeries(series,start, end);
    return series;
}

function getLineSeries(series) {
    var yDataLine = myData.yDataLine;
    if (!yDataLine || yDataLine.length == 0) {
        return;
    }
    var caption = myData.caption;
   var lineColor = myProperty.lineColor[0];
        series.push({
            name: caption[1],
            type: "line",
            symbolSize: myProperty.symbolSize,
            symbol: 'circle',
            yAxisIndex: 1,
            tooltip: {
                formatter: '{value}%'
            },
            itemStyle: {
                normal: {
                    color: {
                        type: 'radial',
                        x: 0.5,
                        y: 0.5,
                        r: 0.5,
                        colorStops: [{
                            offset: 0, color: lineColor,// 0% 处的颜色
                        }, {
                            offset: 0.49, color: lineColor, // 100% 处的颜色
                        }, {
                            offset: 0.5, color: HEX2RGB(lineColor, 0) // 100% 处的颜色
                        }, {
                            offset: 0.6, color: HEX2RGB(lineColor, 0) // 100% 处的颜色
                        }, {
                            offset: 0.7, color: lineColor, // 100% 处的颜色
                        }, {
                            offset: 1, color: HEX2RGB(lineColor, 0), // 100% 处的颜色
                        }],
                        global: false // 缺省为 false
                    },
                }
            },
            lineStyle: {
                normal: {
                    width: myProperty.lineWidth,
                    color: lineColor,
                }
            },
            data: yDataLine.slice(start, end).map(function (ele) {
                return ele; // ele.substr(0, ele.length - 1)
            }),
        })
}

function getBarSeries(series, start, end) {
    var yDataBar = myData.yDataBar;
    var caption = myData.caption;
    series.push({
            name: caption[0],
            type: "bar",
            yAxisIndex: 0,
            barWidth: myProperty.barWidth,
            itemStyle: {
                normal: {
                    color:
                    {
                        type: 'linear',
                        x: 0,
                        y: 0,
                        x2: 0,
                        y2: 1,
                        colorStops: [{
                            offset: 0,
                            color: HEX2RGB(myProperty.barColor[0], 1),
                        }, {
                            offset: 1,
                            color: HEX2RGB(myProperty.barColor[0], 0),
                        }],
                        global: false // 缺省为 false
                    },
                }
            },
            data: yDataBar.slice(start, end)
        })
}

function getPointSeries(series, start, end) {
    var yDataBar = myData.yDataBar;
    var caption = myData.caption;
    series.push({
            name: caption[0],
            type: "pictorialBar",
            yAxisIndex: 0,
            barMaxWidth: myProperty.barWidth,
            symbolPosition: 'end',
            symbol: 'rect',
            symbolSize: [myProperty.barWidth, 10],
            itemStyle: {
                color: {
                    type: 'linear',
                    x: 0,
                    y: 0,
                    x2: 1,
                    y2: 0,
                    colorStops: [{
                        offset: 0,
                        color: myProperty.pointColor[0],
                    }, {
                        offset: 0.5,
                        color: "#fff",
                    },{
                        offset: 1,
                        color: myProperty.pointColor[0],
                    }],
                    global: false // 缺省为 false
                },
                shadowColor: myProperty.pointColor[0],
                shadowBlur: 20,
            },
            zlevel: 2,
            data: yDataBar.slice(start, end),
        })
}

function getYAxis(start, end) {
    return [{
        type: "value",
       // min:  myProperty.leftMin,
        //max:  myProperty.leftMax,
        position: 'left',
        name: myProperty.yLeftName,
        nameTextStyle: {
            color: myProperty.yNamecolor,
            fontSize: myProperty.yNamesize,
            align: "center",
        },
        splitLine: {
            show: true,
            lineStyle: {
                type: "dashed",
                color: 'rgba(30,136,229,0.3)'
            }
        },
        axisLine: {
            show: false
        },
        axisTick: {
            show: false
        },
        axisLabel: {
            show: true,
            color: myProperty.axisFontcolor,
            fontSize: myProperty.axisFontsize
        },
        splitArea: {
            show: false
        },
    }]
}
/**
, {
        type: "value",
        position: 'right',
        min:  myProperty.rightMin,
        max:  myProperty.rightMax,
        name: myProperty.yRightName,
        nameTextStyle: {
            color: myProperty.yNamecolor,
            fontSize: myProperty.yNamesize,
            align: "left",
        },
        splitLine: {
            show: false,
            lineStyle: {
                type: "dashed",
                color: 'rgba(30,136,229,0.3)'
            }
        },
        axisLine: {
            show: false
        },
        axisTick: {
            show: false
        },
        axisLabel: {
            show: true,
            color: myProperty.axisFontcolor,
            fontSize: myProperty.axisFontsize,
            formatter: '{value}%'
        },
        splitArea: {
            show: false
        },
    }
*/
// 定义一个函数来处理标签换行
function wrapText(text) {
    var maxLength = myProperty.xLabelMaxLength; // 设置每行的最大字符数
    if (text.length <= maxLength) {
        return text;
    }
    var wrappedText = '';
    for (var i = 0; i < text.length; i += maxLength) {
        wrappedText += text.substring(i, i + maxLength) + '\n';
    }
    return wrappedText.trim();
}

function getXaxis(start, end) {
    var xdata = myData.xData.map(function (val, ind) {
        if (myProperty.xMonthFlag != "1") {
            return val;
        }
        // return val.substr(0, 4) + "年" + val.substr(4, 2) + "月"
        var str = val.substr(4, 2);
        var num=Number(str);
        if (num < 10) {
            str = str.substr(1, 1);
        }
        return str + "月"
    });
    return [{
        type: "category",
        offset: 10,
        axisLine: {
            show: false
        },
        splitLine: {
            show: false
        },
        axisTick: {
            show: false
        },
        splitArea: {
            show: false
        },
        axisLabel: {
            interval: 0,
            color: myProperty.axisFontcolor,
            fontSize: myProperty.axisFontsize,
            formatter: function(value) {
                 return wrapText(value);
             }
        },
        data: xdata.slice(start, end)
    }]
}

function getToolTip() {
    return {
        trigger: "axis",
        axisPointer: {
            type: 'shadow'
        },
        position: function (point, params, dom, rect, size) {
            return point;
        },
        className: "barlinetool",
        formatter: function (params) {
            var caption = myData.caption;
            var _html = "<div class='tool-left'>";
            caption.forEach((ele, idx) => {
                var i = idx;
                var param = params[i];
                var data = param.data + "%" ;//idx > 1 ? param.data + "%" : param.data;
                _html += "<div class='tool-title'>" + ele + " " + data + "</div>";
            });
            _html += "</div>";
            return _html;
        },
    }
}

function getLegend() {
    var captionTop = myData["captionTop"]
    if (!captionTop) {
        captionTop = myData["caption"]
    }
    return {
        data: captionTop,
        textStyle: {
            color: "#FFFFFF"
        },
    }
}

/**
* 初始化myChart
* @param {*} basedom 
 */
function initMyChart2(basedom) {
    if (myChart || !basedom) return;
    if (!window['echarts']) {
        EUI.include("vfs/root/products/ebi/sys/coolrpt/coolresource/js/third/echarts5.min.js");
    }
    myChart = echarts.init(basedom);
}

/**
* 初始化数据
* @param {*} vardata 
*/
function initMyData(vardata) {
    if (!vardata) return;
    myData = {};
    for (var key in vardata) {
        if (vardata.hasOwnProperty(key)) {
            var element = vardata[key];
            myData[key] = getParseValue(element);
        }
    }
}

function reloadMyData(vardata) {
    if (!vardata) return;
    for (var key in vardata) {
        if (vardata.hasOwnProperty(key)) {
            var element = vardata[key];
            myData[key] = getParseValue(element);
        }
    }
}

/**
 * 16进制转rgb
 * @param {*} hex 
 */
function HEX2RGB(hex, alpha) {
    var r, g, b;
    hex = "" + hex;
    if (typeof hex !== "string") return;
    if (hex.charAt(0) == "#") {
        hex = hex.substring(1);
    }
    if (hex.length == 3) {
        hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];
    }
    if (/^[0-9a-fA-F]{6}$/.test(hex)) {
        r = parseInt(hex.substr(0, 2), 16);
        g = parseInt(hex.substr(2, 2), 16);
        b = parseInt(hex.substr(4, 2), 16);
        return "rgba(" + r + "," + g + "," + b + "," + alpha + ")";
    }
    return hex;
}

/**
 * 定义了自定义属性时,必须实现该方法,方法名为setProperty
 * 当在属性面板上修改属性后,会调用该方法
 * @param key  属性名
 * @param value  属性值
 * @param cwidget  组件对象
 * @returns
 */
function setProperty(key, value, cwidget) {
    var option = myChart.getOption();
    value = getParseValue(value);
    myProperty[key] = value;
    option = getMyOption();
    myChart.setOption(option);
}

/**
 * 刷新操作,数据改变时,调用该方法,重新渲染数据
 * @param cwidget 组件对象
 * @param vardata 取数定义中定义的变量,json格式:{'var1':'xxx'}
 * @param storagedata  组件自己需要存储的值,字符串格式
 * @returns
 */
function refreshDatas(cwidget, vardata, storagedata) {
    var basedom = cwidget.basedom;
    reloadMyData(vardata); // initMyData
    var opt = getMyOption();
    myChart.setOption(opt);
}


/**
 * 组件大小改变时执行
 * @param cwidget 组件对象
 * @returns
 */
function resize(cwidget) {
    if (myChart) {
        myChart.resize();
    }
}

/**
 * 获取组件的参数值
 * @param cwidget 组件对象
 * @returns
 */
function getValue(cwidget) {
    myProperty = {
        gridLeft: cwidget.getProperty("gridLeft"),
        gridTop: cwidget.getProperty("gridTop"),
        gridBottom: cwidget.getProperty("gridBottom"),
        gridRight: cwidget.getProperty("gridRight"),
        barColor: cwidget.getProperty("barColor"),
        barWidth: cwidget.getProperty("barWidth"),
        pointColor: cwidget.getProperty("pointColor"),
        lineColor: cwidget.getProperty("lineColor"),
        lineWidth: cwidget.getProperty("lineWidth"),
        symbolSize: cwidget.getProperty("symbolSize"),
        axisFontcolor: cwidget.getProperty("axisFontcolor"),
        axisFontsize: cwidget.getProperty("axisFontsize"),
        yLeftName: cwidget.getProperty("yLeftName"),
        yRightName: cwidget.getProperty("yRightName"),
        yNamecolor: cwidget.getProperty("yNamecolor"),
        yNamesize: cwidget.getProperty("yNamesize"),
        xMonthFlag: cwidget.getProperty("xMonthFlag"),
        leftMax: cwidget.getProperty("leftMax"),
        rightMax: cwidget.getProperty("rightMax"),
        leftMin: cwidget.getProperty("leftMin"),
        rightMin: cwidget.getProperty("rightMin"),
        pageSize: cwidget.getProperty("pageSize"),
        xLabelMaxLength: cwidget.getProperty("xLabelMaxLength"),
    };
    if (myProperty.pageSize) {
        pageSize = myProperty.pageSize;    
    }
    for (var key in myProperty) {
        if (myProperty.hasOwnProperty(key)) {
            var element = myProperty[key];
            myProperty[key] = getParseValue(element);
        }
    }
}

/**
* 获取组件的参数名称
* @param cwidget 组件对象
* @returns
 */
function getParamName(cwidget) { }
function getParseValue(value) {
    try {
        value = JSON.parse(value);
    } catch (error) { }
    return value;
}


/*
 * 销毁操作,销毁自己相关的东西
 */
function dispose(cwidget) {
    if (myChart) {
        myChart.dispose();
        myChart = null;
    }
    myProperty = null;
    myData = null;
}

 

css

@charset "utf-8";
/* CSS Document */
.pagination {
    display: flex;
    justify-content: center;
    align-items: center;
    margin-top: 16px;
}
.pagination button {
    background-color: transparent;
    border: none;
    cursor: pointer;
    padding: 5px;
}
.pagination span {
    margin: 0 10px;
    color: white;
}
.arrow {
    width: 0;
    height: 0;
    border-top: 5px solid transparent;
    border-bottom: 5px solid transparent;
}
.leftArrow {
    border-right: 6px solid #00b0ff;
}
.rightArrow {
    border-left: 6px solid #00b0ff;
}
.disabledArrowRight {
    border-left: 6px solid gray; /* 或者 border-left */
}
.disabledArrowLeft {
    border-right: 6px solid gray; /* 或者 border-left */
}
.barlinetool{
    padding:0 !important;
    background-color: transparent !important;
    border:none !important;
}
.tool-left{
    padding: 10px 10px;
    background-color: rgba(32, 155, 253, 0.36);
    border: 1px solid #2D80FE;
    border-radius: 6px;
}

.tool-left>div{
    margin-bottom:15px;
}
.tool-title{
    font-size:15px;
    color:#fff;
    text-align:left;
}
.val{
    color:#00B7FF;
    font-size:30px;
    line-height:20px;
    font-weight: bold;
}
.name{
    color:#fff;
    font-size:30px;
    line-height:20px;
}

.spanDom{
    width:100%;
    display: flex;
    justify-content: space-between;
    padding: 2px 0;
}

 

posted @ 2025-05-07 16:24  仓鼠爱画方格子  阅读(46)  评论(0)    收藏  举报