XPaging前端分頁組件


前言

專注拖控件6年的C#程序員,迫於某種原因做起了前端開發,然后發現純前端寫起來要人命啊,所有的頁面交互邏輯全是JS代碼控制,寫起來好難受。幸虧我JS功底深厚(自戀中……別打擾我……),很快就適應了,不然真的被搞死。

不過寫到后面發現,純JS控制用戶交互,體驗效果比aspx頁面好多了。頁面樣式雖然是自己手寫的,沒用什么前端框架,但是用的Vue數據框架啊,然后發現Vue有組件開發模式,就想着是不是可以把原來ascx控件變成組件,這樣寫前端也變成拖控件了(PS:雖然是寫標簽),但開發效率肯定提升很大啊。

於是開始折騰啟分頁組件,因為使用次數高,而且也是最麻煩的一個,就試着把原來的ascx分頁組件變成前端的,前面我寫過一篇分頁算法,這里我直接改成JS代碼,這也是分頁組件最核心的代碼。

正文

 首先,遵循Vue的組件規范,定義組件模板,並進行全局注冊,基礎知識不知道的請看這里,代碼如下:

//注冊Vue組件
Vue.component('x-paging', {
    props: ['codelist', 'total', 'pagelist'],
    template: '<div id="xpaging" class="pagenum"><span class="pagemsg">每頁 '
        + '<select id="pagesize" name="pagesize" onchange="XPaging.Api.ChangePageSize(this)">'
        + '<option v-bind:selected="code.selected?\'selected\':\'\'" v-for="code in codelist">{{code.pagesize}}</option>'
        + '</select>條 '
        + '共<span class="number">{{total}}</span>條記錄</span>'
        + '<a v-bind:class="page.ClassName" href="javascript:;" v-for="page in pagelist" v-on:click="XPaging.Api.PageTurn(page.Value)">{{page.Code}}</a></div>'
});

這里使用三個prop變量進行數據的交互,codelist:每頁數據大小集合,俗稱pagesize;total:總記錄數;pagelist:頁碼集合,就是第一頁,第二頁,第三頁……

需要注意的是Vue定義組件,必須用一個標簽包括起來,不然組件無法生效。

其次,就是組件的樣式,代碼如下:

/*
    分頁控件樣式庫
*/
.pagenum {
    float: left;
    height: 26px;
    line-height: 26px;
    font-size: 14px;
    margin-top: 8px;
    margin-bottom: 7px;
    vertical-align: middle;
}

    /*頁碼格子*/
    .pagenum a {
        text-decoration: none;
        text-align: center;
        display: block;
        float: left;
        height: 16px;
        line-height: 16px;
        padding: 5px 7px 5px 7px;
        vertical-align: middle;
        min-width: 16px;
        border-radius: 2px;
        margin-right: 5px;
    }

        .pagenum a:link, a:visited {
            text-decoration: none;
        }

        .pagenum a:hover, a:active {
            text-decoration: none;
        }

        .pagenum a:hover {
            background-color: #f15a22;
            opacity: .7;
            filter: alpha(opacity=70);
            color: #ffffff;
        }

/*總記錄數*/
.number {
    color: #F30;
    margin-left: 5px;
    margin-right: 5px;
}

/*每頁記錄數*/
.pagemsg {
    text-align: center;
    display: block;
    float: left;
    height: 26px;
    line-height: 26px;
    margin-right: 10px;
    vertical-align: middle;
}

/*當前頁碼*/
.currindex {
    color: #FFF;
    background: #009ad6;
}

/*侯選頁*/
.waitpage {
    color: #4f5555;
    background: #F0f0f0;
}

.pagenum select {
    margin-right: 4px;
    height: 22px;
    padding: 0px 0px;
    font-size: 13px;
    font-weight: bold;
    color: #F30;
}

再次,就是為了統一pagesize,和默認的頁面大小,我將其寫入了一個json文件中。

為什么要這樣呢?就是因為設計時,此控件會記錄用戶設置的頁面大小,當打開其他頁面或者刷新當前頁面時,會默認設置用戶上次選擇的頁面大小,代碼如下:

{
  "XPageSize": [
    {
      "pagesize": 2,
      "selected": false
    },
    {
      "pagesize": 5,
      "selected": false
    },
    {
      "pagesize": 10,
      "selected": true
    },
    {
      "pagesize": 15,
      "selected": false
    },
    {
      "pagesize": 20,
      "selected": false
    },
    {
      "pagesize": 25,
      "selected": false
    },
    {
      "pagesize": 30,
      "selected": false
    },
    {
      "pagesize": 40,
      "selected": false
    },
    {
      "pagesize": 50,
      "selected": false
    },
    {
      "pagesize": 100,
      "selected": false
    }
  ],
  "XCodeNum": 5
}

pagesize和selected我就不說了,其中XCodeNum表示的是”連續頁碼顯示的個數“,例如”1,2,3,4,5,……,10“連續顯示5個頁碼。

最后,就是組件實現的JS代碼了,核心方法有:

1.根據總記錄數和連續頁碼顯示個數,生成頁碼集合,就是pagelist;

2.獲取json文件的數據,生成codelist,以及存儲用戶設置的頁面大小,以便下次調用;

3.頁面跳轉,以及跳轉后執行數據刷新方法等。

代碼過長,只貼部分代碼,要看完整的代碼,及使用實例,請下載源碼

//插件默認參數
    var options = {
        //連續頁碼顯示個數(必須是奇數)
        ContinNO: 5,
        //索引頁
        CurrentPageIndex: 1,
        //總頁數
        PageCount: 0,
        //頁面顯示記錄數
        PaseSize: 0,
        //綁定數據方法名
        DataBindFunc: "",
        //JSON配置文件路徑
        ConfigUrl: "../lib/XPaging/XPaingConfig.json"
    };

    //用戶調用接口
    var XPagingInit = {
        //配置信息
        config: function (opts) {
            //沒有參數傳入,直接返回默認參數
            if (!opts) return options;
            //有參數傳入,通過key將options的值更新為用戶的值
            for (var key in opts) {
                options[key] = opts[key];
            }
            return this;
        },
        //初始化插件
        init: function (vueObj) {
            $.ajax({
                type: "GET",
                url: options.ConfigUrl,
                async: false,
                dataType: 'Json',
                success: function (result) {
                    options.ContinNO = result.XCodeNum;
                    Xdata.SetPageSize(result.XPageSize, vueObj);
                    Xdata.GetPageCount(vueObj.total);
                    Xdata.GetPageList(vueObj);
                },
                error: function (data, XMLHttpRequest, textStatus, errorThrown) {
                    alert("分頁控件初始化失敗,返回信息:" + JSON.stringify(data));
                }
            });
            return this;
        },
        //獲取當前頁索引
        GetCurrentPageIndex: function () {
            return options.CurrentPageIndex;
        },
        //獲取頁面大小
        GetPageSize: function () {
            return options.PaseSize;
        }
    };

 最終的運行效果如下圖:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM