小卷的胡言亂語

隨心。隨興。隨喜。隨緣



Vue使用Componet自訂分頁-以MVC C#實做

請參考前文:Vue 自訂分頁 - 以 MVC C# 實做
前一篇文章記錄了用Vue.js自刻分頁,後來因重複使用的需求故改寫為Component,就在這篇文章紀錄一下啦。

使用語言、資源及相關架構


請參考前文:Vue 自訂分頁 - 以 MVC C# 實做

以下是正文


分頁樣式:
[|<][<][1][2][3][4][…][>][>|]

以下就上面所示撰寫範例。
程式碼請參考前文:Vue 自訂分頁 - 以 MVC C# 實做,本篇僅就調整/更新的部分提供說明。

後端

1.web.config初始化設定=>同前篇,不變
2.資料=>同前篇,不變
3.資料模型=>同前篇,不變
4.分頁資料模型=>同前篇,不變
5.分頁資料邏輯=>同前篇,不變
6.撰寫取資料、取得分頁相關設定值的Service=>同前篇,不變
7.HomeController.cs
設定值同前篇,不變。為了與前篇做區隔,這裡以另一個View顯示

public ActionResult IndexComp()
{
    SetInitial();
    return View();
}

前端

8.IndexComp.cshtml
除了加入的Partial、js檔案不同,其他不變

<div class="page-footer">
    <div class="container-fluid text-center py-3">
        <div class="row">
            @{ Html.RenderPartial("Partial_PageComp");}
        </div>
    </div>                        
</div> 
<script src="~/Scripts/indexcomp.js"></script>

9.分頁css=>同前篇,不變
10.Javascript(indexcomp.js)
定義component(必須要vue使用前先予定義)

Vue.component('paging-element', {
    /* pagegroup:顯示之頁碼列表 / totpage:總頁數 / currentitem:目前頁碼       
       enableleft:左側功能鈕是否可使用 / enableright:右側功能鈕是否可使用 / leftellipses:左側'更多'鈕是否顯示 / rightellipses:右側'更多'鈕是否顯示            
       leftellipindex:左側'更多'鈕頁碼index / rightellipindex:右側'更多'鈕頁碼index    */
    props:
        ['pagegroup', 'totpage', 'currentitem',
         'enableleft', 'enableright', 'leftellipses', 'rightellipses',
         'leftellipindex', 'rightellipindex'],
    template:   
            '<div class="pagination">' +
                '<ul class="pagination pagination-sm">' +
                    '<li v-bind:class="[enableleft ? \'\' : \'btndisabled\']" @click="setMethod(1)">' +
                        '<a href="#" class="page-link" title="第一頁" ><i class="fa fa-angle-double-left"></i></a>' +
                    '</li>' +
                    '<li v-bind:class="[enableleft ? \'\' : \'btndisabled\']" @click="setMethod(parseInt(currentitem)-1)">' +
                        '<a href="#" class="page-link" title="上一頁"><i class="fa fa-angle-left" ></i></a>' +
                    '</li>' +
                    '<li @click="setMethod(leftellipindex)">' +
                        '<a href="#" class="page-link" v-show="leftellipses" title="更多...">...</a>' +
                    '</li>' +
                    '<li v-for="p in pagegroup" @click="setMethod(p)" v-bind:class="[(parseInt(p) === parseInt(currentitem)) ? \'active\' : \'\']">' +
                        '<a href="#" class="page-link">{{ p }}</a>' +
                    '</li>' +
                    '<li @click="setMethod(rightellipindex)">' +
                        '<a href="#" class="page-link" v-show="rightellipses" title="更多...">...</a>' +
                    '</li>' +
                    '<li v-bind:class="[enableright ? \'\' : \'btndisabled\']" @click="setMethod(parseInt(currentitem)+1)">' +
                        '<a href="#" class="page-link" title="下一頁"><i class="fa fa-angle-right"></i></a>' +
                    '</li>' +
                    '<li v-bind:class="[enableright ? \'\' : \'btndisabled\']" @click="setMethod(totpage)">' +
                        '<a href="#" class="page-link" title="最末頁"><i class="fa fa-angle-double-right" ></i></a>' +
                    '</li>' +
                '</ul>' +
            '</div>'
        ,
    methods: {
        setMethod: function (page) {
            this.$emit('pagemethod', page);
        }
    }
})

首先定義的props,這部分是將Vue component內的屬性與你的資料模型屬性相連結(串接)的設定。

再來定義的template,官方提供可以使用鍵盤上的’飄’位置的另一個符號表達,
但號稱支援IE的Vue若這樣寫,在IE上會死掉而無法執行,僅能採用javascript能吃的字串的表達方式。
傻露就不提供’飄’位置的另一個符號表達方式啦,避免會與部落格上markdown語法打架。

最後的methods,component內部定義了一個setMethod函式,裡面使用$emit告訴vue,我要把資料(page)傳回給父組件,並由pagemethod此方式串接父子。

11.Partial_PageComp.cshtml
有了Vue Component就可以開始寫這隻code了

<paging-element     
    v-bind:pagegroup="dataPage.DisplayPageZone" 
    v-bind:totpage = "dataPage.TotalPage"        
    v-bind:currentitem="dataPage.CurrentPage"              
    v-bind:pagetype="dataPage.UseType"
    v-bind:enableleft = "dataPage.EnableLeft"
    v-bind:enableright = "dataPage.EnableRight"
    v-bind:leftellipses = "dataPage.DisplayLeftEllipsesZone"
    v-bind:rightellipses = "dataPage.DisplayRightEllipsesZone"    
    v-bind:leftellipindex = "dataPage.LeftEllipsIndex"
    v-bind:rightellipindex = "dataPage.RightEllipsIndex"
    v-on:pagemethod ="setPage"
>    
</paging-element>   

透過v-bind綁定資料模型屬性&component屬性。透過v-on綁定父組件的function& component的function。

參考資料

Vue – Vue.component 組件教學 – 使用 v-bind、v-for、x-template