国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

VUE實現(xiàn)一個分頁組件的示例

來源:懂視網(wǎng) 責編:小采 時間:2020-11-27 22:30:08
文檔

VUE實現(xiàn)一個分頁組件的示例

VUE實現(xiàn)一個分頁組件的示例:分頁是WEB開發(fā)中很常用的功能,尤其是在各種前后端分離的今天,后端API返回數(shù)據(jù),前端根據(jù)數(shù)據(jù)的count以及當前頁碼pageIndex來計算分頁頁碼并渲染到頁面上已經(jīng)是一個很普通很常見的功能了。從最開始的jquery時代到現(xiàn)在的各種各樣的前端框架時代,分頁功能都是
推薦度:
導(dǎo)讀VUE實現(xiàn)一個分頁組件的示例:分頁是WEB開發(fā)中很常用的功能,尤其是在各種前后端分離的今天,后端API返回數(shù)據(jù),前端根據(jù)數(shù)據(jù)的count以及當前頁碼pageIndex來計算分頁頁碼并渲染到頁面上已經(jīng)是一個很普通很常見的功能了。從最開始的jquery時代到現(xiàn)在的各種各樣的前端框架時代,分頁功能都是

分頁是WEB開發(fā)中很常用的功能,尤其是在各種前后端分離的今天,后端API返回數(shù)據(jù),前端根據(jù)數(shù)據(jù)的count以及當前頁碼pageIndex來計算分頁頁碼并渲染到頁面上已經(jīng)是一個很普通很常見的功能了。從最開始的jquery時代到現(xiàn)在的各種各樣的前端框架時代,分頁功能都是必不可少的。

分頁大多數(shù)(基本上)情況下都是對異步數(shù)據(jù)列表的處理,這里首先需要明白一下分頁的流程。

在已知每頁顯示數(shù)據(jù)量pageSize以及當前頁碼pageIndex的情況下:

  • 請求API,返回第一屏數(shù)據(jù)(pageSize內(nèi))以及所有相關(guān)條件的數(shù)據(jù)總量count
  • 將數(shù)據(jù)總量傳遞給page組件,來計算頁碼并渲染到頁面上
  • 點擊頁碼,發(fā)送請求獲取該頁碼的數(shù)據(jù),返回數(shù)據(jù)總量count以及該頁碼下的數(shù)據(jù)條目。
  • 由于獲取數(shù)據(jù)條件的變化(假設(shè)是個搜索,關(guān)鍵詞變了),count是不定的;再或者,有個select下拉框,來控制每頁顯示的數(shù)據(jù)量pageSize,當它變化的時候,總頁碼肯定也是要變化的。因此很多情況下要重新計算頁碼并渲染。

    了解了流程,在Vue中實現(xiàn)一個分頁組件也就變得簡單了。

    簡單處理,樣式類似于bootstrap的分頁組件,在第一頁時,禁用上一頁,以及首頁按鈕;在最后一頁時,禁用下一頁,以及尾頁按鈕;超出范圍的頁碼以…來代替,效果圖如下:

    由于獲取數(shù)據(jù)條件的變化(假設(shè)是個搜索,關(guān)鍵詞變了),count是不定的;再或者,有個select下拉框,來控制每頁顯示的數(shù)據(jù)量pageSize,當它變化的時候,總頁碼肯定也是要變化的。因此很多情況下要重新計算頁碼并渲染。

    了解了流程,在Vue中實現(xiàn)一個分頁組件也就變得簡單了。

    簡單處理,樣式類似于bootstrap的分頁組件,在第一頁時,禁用上一頁,以及首頁按鈕;在最后一頁時,禁用下一頁,以及尾頁按鈕;超出范圍的頁碼以…來代替,效果圖如下:

    分頁組件
    template

    <template>
     <ul class="mo-paging">
     <!-- prev -->
     <li :class="['paging-item', 'paging-item--prev', {'paging-item--disabled' : index === 1}]" @click="prev">prev</li>
     
     <!-- first -->
     <li :class="['paging-item', 'paging-item--first', {'paging-item--disabled' : index === 1}]" @click="first">first</li>
     
     <li :class="['paging-item', 'paging-item--more']" v-if="showPrevMore">...</li>
     
     <li :class="['paging-item', {'paging-item--current' : index === pager}]" v-for="pager in pagers" @click="go(pager)">{{ pager }}</li>
     
     <li :class="['paging-item', 'paging-item--more']" v-if="showNextMore">...</li>
     
     <!-- last -->
     <li :class="['paging-item', 'paging-item--last', {'paging-item--disabled' : index === pages}]" @click="last">last</li>
     
     <!-- next -->
     <li :class="['paging-item', 'paging-item--next', {'paging-item--disabled' : index === pages}]" @click="next">next</li>
     </ul>
    </template>
    

    style(scss)

    .mo-paging {
     display: inline-block;
     padding: 0;
     margin: 1rem 0;
     font-size: 0;
     list-style: none;
     user-select: none;
     > .paging-item {
     display: inline;
     font-size: 14px;
     position: relative;
     padding: 6px 12px;
     line-height: 1.42857143;
     text-decoration: none;
     border: 1px solid #ccc;
     background-color: #fff;
     margin-left: -1px;
     cursor: pointer;
     color: #0275d8;
     &:first-child {
     margin-left: 0;
     }
     &:hover {
     background-color: #f0f0f0;
     color: #0275d8;
     }
     &.paging-item--disabled,
     &.paging-item--more{
     background-color: #fff;
     color: #505050;
     }
     //禁用
     &.paging-item--disabled {
     cursor: not-allowed;
     opacity: .75;
     }
     &.paging-item--more,
     &.paging-item--current {
     cursor: default;
     }
     //選中
     &.paging-item--current {
     background-color: #0275d8;
     color:#fff;
     position: relative;
     z-index: 1;
     border-color: #0275d8;
     }
     }
    }
    

    javascript

    export default {
     name : 'MoPaging',
     //通過props來接受從父組件傳遞過來的值
     props : {
     
     //頁面中的可見頁碼,其他的以...替代, 必須是奇數(shù)
     perPages : { 
     type : Number,
     default : 5 
     },
     
     //當前頁碼
     pageIndex : {
     type : Number,
     default : 1
     },
     
     //每頁顯示條數(shù)
     pageSize : {
     type : Number,
     default : 10
     },
     
     //總記錄數(shù)
     total : {
     type : Number,
     default : 1
     },
     
     },
     methods : {
     prev(){
     if (this.index > 1) {
     this.go(this.index - 1)
     }
     },
     next(){
     if (this.index < this.pages) {
     this.go(this.index + 1)
     }
     },
     first(){
     if (this.index !== 1) {
     this.go(1)
     }
     },
     last(){
     if (this.index != this.pages) {
     this.go(this.pages)
     }
     },
     go (page) {
     if (this.index !== page) {
     this.index = page
     //父組件通過change方法來接受當前的頁碼
     this.$emit('change', this.index)
     }
     }
     },
     computed : {
     
     //計算總頁碼
     pages(){
     return Math.ceil(this.size / this.limit)
     },
     
     //計算頁碼,當count等變化時自動計算
     pagers () {
     const array = []
     const perPages = this.perPages
     const pageCount = this.pages
     let current = this.index
     const _offset = (perPages - 1) / 2
     
     
     const offset = {
     start : current - _offset,
     end : current + _offset
     }
     
     //-1, 3
     if (offset.start < 1) {
     offset.end = offset.end + (1 - offset.start)
     offset.start = 1
     }
     if (offset.end > pageCount) {
     offset.start = offset.start - (offset.end - pageCount)
     offset.end = pageCount
     }
     if (offset.start < 1) offset.start = 1
     
     this.showPrevMore = (offset.start > 1)
     this.showNextMore = (offset.end < pageCount)
     
     for (let i = offset.start; i <= offset.end; i++) {
     array.push(i)
     }
     
     return array
     }
     },
     data () {
     return {
     index : this.pageIndex, //當前頁碼
     limit : this.pageSize, //每頁顯示條數(shù)
     size : this.total || 1, //總記錄數(shù)
     showPrevMore : false,
     showNextMore : false
     }
     },
     watch : {
     pageIndex(val) {
     this.index = val || 1
     },
     pageSize(val) {
     this.limit = val || 10
     },
     total(val) {
     this.size = val || 1
     }
     }
    }
    

    父組件中使用

    <template>
     <div class="list">
     <template v-if="count">
     <ul>
     <li v-for="item in items">...</li>
     </ul>
     <mo-paging :page-index="currentPage" :totla="count" :page-size="pageSize" @change="pageChange">
     </mo-paging>
     </template>
     </div>
    </template>
    <script>
     import MoPaging from './paging'
     export default {
     //顯示的聲明組件
     components : {
     MoPaging 
     },
     data () {
     return {
     pageSize : 20 , //每頁顯示20條數(shù)據(jù)
     currentPage : 1, //當前頁碼
     count : 0, //總記錄數(shù)
     items : []
     }
     },
     methods : {
     //獲取數(shù)據(jù)
     getList () {
     //模擬
     let url = `/api/list/?pageSize=${this.pageSize}¤tPage=${this.currentPage}`
     this.$http.get(url)
     .then(({body}) => {
     
     //子組件監(jiān)聽到count變化會自動更新DOM
     this.count = body.count
     this.items = body.list
     })
     },
     
     //從page組件傳遞過來的當前page
     pageChange (page) {
     this.currentPage = page
     this.getList()
     }
     },
     mounted() {
     //請求第一頁數(shù)據(jù)
     this.getList()
     } 
     }
    </script>
    

    聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    VUE實現(xiàn)一個分頁組件的示例

    VUE實現(xiàn)一個分頁組件的示例:分頁是WEB開發(fā)中很常用的功能,尤其是在各種前后端分離的今天,后端API返回數(shù)據(jù),前端根據(jù)數(shù)據(jù)的count以及當前頁碼pageIndex來計算分頁頁碼并渲染到頁面上已經(jīng)是一個很普通很常見的功能了。從最開始的jquery時代到現(xiàn)在的各種各樣的前端框架時代,分頁功能都是
    推薦度:
    標簽: VUE 示例 組件
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 国产一级片在线 | 欧美日韩中 | www.欧美色图| er久99久热只有精品国产 | 视频在线一区二区 | 国产精品久久久久久久久免费 | 国产中出 | 小处雏高清一区二区三区 | 在线 v亚洲 v欧美v 专区 | 在线免费观看国产 | 国产亚洲欧美一区二区 | 欧美色视频在线观看 | 国产成人精品久久一区二区三区 | 欧美日韩综合视频 | 国产高清精品一级毛片 | 中文字幕久久亚洲一区 | 国产精品美女一区二区三区 | 日本啊v | 欧美综合图区亚洲综合图区 | 国产综合成人久久大片91 | 欧美极品一区 | 精品欧美一区二区三区 | 国产成人无精品久久久久国语 | 欧美人在线一区二区三区 | 欧洲亚洲一区 | 欧美日韩在线亚洲国产人 | 国产免费黄色 | 毛片视频网址 | 成人久久久精品乱码一区二区三区 | 亚洲第一页色 | 日韩欧美一区二区三区中文精品 | 亚洲第一页在线视频 | 国产在线操| 欧美一级高清片欧美国产欧美 | 水蜜桃网站| 精品日韩欧美国产一区二区 | 亚洲欧美日韩一区 | 一级成人毛片免费观看 | 日韩一区二区三区在线播放 | 91九色国产porny | 91精品国产免费久久久久久 |