2016-02-24 5 views
17

私はこのようなコードを持っている:
VueJsリミッターとレンジでページネーションを作る方法は?

var demoList = new Vue({ 
 
    el: '#demoList', 
 
    data: { 
 
    items: [{ 
 
     "id": 1, 
 
     "name": "Tom" 
 
    }, { 
 
     "id": 2, 
 
     "name": "Kate" 
 
    }, { 
 
     "id": 3, 
 
     "name": "Jack" 
 
    }, { 
 
     "id": 4, 
 
     "name": "Jill" 
 
    }, { 
 
     "id": 5, 
 
     "name": "aa" 
 
    }, { 
 
     "id": 6, 
 
     "name": "bb" 
 
    }, { 
 
     "id": 7, 
 
     "name": "cc" 
 
    }, { 
 
     "id": 8, 
 
     "name": "dd" 
 
    }, { 
 
     "id": 1, 
 
     "name": "Tom" 
 
    }, { 
 
     "id": 2, 
 
     "name": "Kate" 
 
    }, { 
 
     "id": 3, 
 
     "name": "Jack" 
 
    }, { 
 
     "id": 4, 
 
     "name": "Jill" 
 
    }, { 
 
     "id": 5, 
 
     "name": "aa" 
 
    }, { 
 
     "id": 6, 
 
     "name": "bb" 
 
    }, { 
 
     "id": 7, 
 
     "name": "cc" 
 
    }, { 
 
     "id": 8, 
 
     "name": "dd" 
 
    }, ], 
 
    loading: false, 
 
    order: 1, 
 
    searchText: null, 
 
    ccn: null, 
 
    currentPage: 0, 
 
    itemsPerPage: 2, 
 
    resultCount: 0 
 
    }, 
 
    computed: { 
 
    totalPages: function() { 
 
     console.log(Math.ceil(this.resultCount/this.itemsPerPage) + "totalPages"); 
 
     return Math.ceil(this.resultCount/this.itemsPerPage); 
 

 
    } 
 
    }, 
 
    methods: { 
 
    setPage: function(pageNumber) { 
 
     this.currentPage = pageNumber; 
 
     console.log(pageNumber); 
 
    } 
 
    }, 
 
    filters: { 
 
    paginate: function(list) { 
 
     this.resultCount = this.items.length; 
 
     console.log(this.resultCount + " Result count"); 
 
     console.log(this.currentPage + " current page"); 
 
     console.log(this.itemsPerPage + " items per page"); 
 
     console.log(this.totalPages + " Total pages 2"); 
 
     if (this.currentPage >= this.totalPages) { 
 
     this.currentPage = Math.max(0, this.totalPages - 1); 
 
     } 
 
     var index = this.currentPage * this.itemsPerPage; 
 
     console.log(index + " index"); 
 
     console.log(this.items.slice(index, index + this.itemsPerPage)); 
 
     return this.items.slice(index, index + this.itemsPerPage); 
 
    } 
 
    } 
 
});
a { 
 
    color: #999; 
 
} 
 
.current { 
 
    color: red; 
 
} 
 
ul { 
 
    padding: 0; 
 
    list-style-type: none; 
 
} 
 
li { 
 
    display: inline; 
 
    margin: 5px 5px; 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/1.0.16/vue.js"></script> 
 
<div id="demoList"> 
 
    <div class="containerTable"> 
 
    <table class="table"> 
 
     <thead> 
 
     <tr class="header"> 
 
      <th> 
 
      <div><a @click="sortvia('provider_name')">Provider</a> 
 
      </div> 
 
      </th> 
 
     </tr> 
 
     </thead> 
 
     <tbody> 
 
     <tr v-for="item in items | paginate"> 
 
      <td>{{item.name}}</td> 
 
     </tr> 
 
     </tbody> 
 
    </table> 
 
    </div> 
 
    <ul> 
 
    <li v-for="pageNumber in totalPages"> 
 
     <a href="#" @click="setPage(pageNumber)">{{ pageNumber+1 }}</a> 
 
    </li> 
 
    </ul> 
 
</div>

Imはvuejsとページャを作成しようとして立ち往生するので、誰もがこのようなページャを作成する方法の一例を任命することができる場合、私は不思議でしたもし可能なら "1-2-3-4-5 ... 55"、再び助けてくれてありがとう。

+0

希望する出力をさらに説明できますか? –

+0

私はこのようなページ番号にしたい "1-2-3-4-5 ...最後の"すべてではありません1-2-3-4-5-6 -7-8 – b4dQuetions

+0

ngif = "$ index - page <5 " –

答えて

23

このコードをチェックアウト:

https://jsfiddle.net/os7hp1cy/48/

HTML:

<ul> 
    <li v-for="pageNumber in totalPages" 
     v-if="Math.abs(pageNumber - currentPage) < 3 || pageNumber == totalPages - 1 || pageNumber == 0"> 
    <a href="#" @click="setPage(pageNumber)" 
     :class="{current: currentPage === pageNumber, last: (pageNumber == totalPages - 1 && Math.abs(pageNumber - currentPage) > 3), first:(pageNumber == 0 && Math.abs(pageNumber - currentPage) > 3)}"> 
     {{ pageNumber+1 }}</a> 
    </li> 
</ul> 

をCSS:

a.first::after { 
    content:'...' 
} 

a.last::before { 
    content:'...' 
} 

は基本的には、それだけで現在の2ページにあるページネーションを示しページ。その後、ページ1と最後のページも表示され、CSSの番号の前後に"..."が置かれます。

1... 8 9 10 11 12 ...21

+0

私の例でこのコードを試しましたが、何らかの理由で警告メッセージが表示されます: [Vue警告]:プロパティまたはメソッド" paginate "がインスタンスに定義されていませんが、レンダリング中に参照されます。データオプションで無効なデータプロパティを宣言してください。 (ルートインスタンスにあります) メソッドの内部にあるフィルタにページ設定機能があります。 – linous

1

私はジェフのコード@フォークきたし、これによるフィルタの移行https://vuejs.org/v2/guide/migration.html#Filters-Outside-Text-Interpolations-removedにVueの2のための作業バージョンを作る:あなたは10ページにあるのであれば、それが表示されます。

のpaginateメソッドは、計算に移動されます。

paginate: function() { 
     if (!this.users || this.users.length != this.users.length) { 
      return 
     } 
     this.resultCount = this.users.length 
     if (this.currentPage >= this.totalPages) { 
      this.currentPage = this.totalPages 
     } 
     var index = this.currentPage * this.itemsPerPage - this.itemsPerPage 
     return this.users.slice(index, index + this.itemsPerPage) 
    } 

警告:私は最初のテキストフィルタ、ちょうどページネーションを適用しませんでした。

https://jsfiddle.net/c1ghkw2p/

関連する問題