Vue學(xué)習(xí)筆記-實(shí)現(xiàn)一個(gè)分頁組件

分頁組件在web項(xiàng)目中是十分常見的組件初茶,讓我們用vue來實(shí)現(xiàn)一個(gè)簡單的分頁組件。

功能點(diǎn):

1.點(diǎn)擊頁面序號可以跳轉(zhuǎn)到相應(yīng)頁面浊闪。
2.點(diǎn)擊上一頁或者下一頁可以跳轉(zhuǎn)頁面恼布,當(dāng)頁面在第一頁時(shí)上一頁無法點(diǎn)擊,頁面在最后一頁時(shí)下一頁無法點(diǎn)擊搁宾。
3.一次顯示當(dāng)前頁面的前兩頁和后兩頁
4.當(dāng)當(dāng)前頁面的序號和第一頁與最后一頁相差三個(gè)以上時(shí)出現(xiàn)省略號
5.始終顯示第一頁和最后一頁折汞,只有一頁的時(shí)候顯示一頁

組件代碼:

Pagination.vue
<!--
  params:
    pageNo: 總頁數(shù)
    current: 當(dāng)前的頁碼
 -->
<template>
  <div class="pager">
    <button class="btn btn-pager" :disabled="this.current == 1" @click="prePage">上一頁</button>
    <span v-if="pageNo !== 1" class="page-index {{ 1 == current ? 'active':''}}" @click="goPage(1)">1</span>
    <span v-if="preClipped" class="page-index">...</span>
    <span v-for="index in pages" class="page-index {{ index == current ? 'active':''}} " @click="goPage(index)">{{index}}</span>
    <span v-if="backClipped" class="page-index">...</span>
    <span class="page-index {{ pageNo == current ? 'active':''}} " @click="goPage(pageNo)">{{pageNo}}</span>
    <button class="btn btn-pager" :disabled="this.current == pageNo" @click="nextPage">下一頁</button>
  </div>
</template>

1.給頁碼標(biāo)簽綁定class,使用對象語法盖腿,讓當(dāng)前的頁碼附上'active'類名爽待,這樣可以動態(tài)的得到active的樣式,使得當(dāng)前頁碼區(qū)別于其他頁碼
2.給button綁定:disabled屬性奸忽,讓按鈕在當(dāng)前頁面等于最后一頁或者第一頁時(shí)無法點(diǎn)擊
3.goPage方法綁定在頁碼標(biāo)簽上實(shí)現(xiàn)點(diǎn)擊頁面索引堕伪,跳轉(zhuǎn)到相應(yīng)頁面
4.prePage方法和nextPage方法綁定在button上實(shí)現(xiàn)頁面跳轉(zhuǎn)
5.使用v-if指令動態(tài)判斷省略號和第一頁是否能顯示
6使用v-for指令將所有應(yīng)該顯示的頁碼遍歷出來

JS部分就直接以注釋來說明

<script>
export default {
  props: {
    // 用于記錄總頁碼,可由父組件傳過來
    pageNo: {
      type: Number,
      default: 1
    },
    // 用于記錄當(dāng)前頁數(shù)栗菜,這個(gè)與父組件進(jìn)行數(shù)據(jù)交互來完成每一頁的數(shù)據(jù)更新欠雌,所以我們只要改變current的值來控制整個(gè)頁面的數(shù)據(jù)即可
    current: {
      type: Number,
      default: 1
    }
  },
  data: function () {
    return {
      // 用于判斷省略號是否顯示
      backClipped: true, 
      preClipped: false
    }
  },
  methods: {
    prePage () {
      // 上一頁
      this.current--
    },
    nextPage () {
      // 下一頁
      this.current++
    },
    goPage (index) {
      // 跳轉(zhuǎn)到相應(yīng)頁面
      if (index !== this.current) {
        this.current = index
      }
    }
  },
  computed: {
    // 使用計(jì)算屬性來得到每次應(yīng)該顯示的頁碼
    pages: function () {
      let ret = []
      if (this.current > 3) {
        // 當(dāng)前頁碼大于三時(shí),顯示當(dāng)前頁碼的前2個(gè)
        ret.push(this.current - 2)
        ret.push(this.current - 1)
        if (this.current > 4) {
          // 當(dāng)前頁與第一頁差距4以上時(shí)顯示省略號
          this.preClipped = true
        }
      } else {
        this.preClipped = false
        for (let i = 2; i < this.current; i++) {
          ret.push(i)
        }
      }
      if (this.current !== this.pageNo && this.current !== 1) {
        ret.push(this.current)
      }
      if (this.current < (this.pageNo - 2)) {
        // 顯示當(dāng)前頁碼的后2個(gè)
        ret.push(this.current + 1)
        ret.push(this.current + 2)
        if (this.current <= (this.pageNo - 3)) {
          當(dāng)前頁與最后一頁差距3以上時(shí)顯示省略號
          this.backClipped = true
        }
      } else {
        this.backClipped = false
        for (let i = (this.current + 1); i < this.pageNo; i++) {
          ret.push(i)
        }
      }
      // 返回整個(gè)頁碼組
      return ret
    }
  }
}
</script>
// 組件樣式
<style scoped>
.pager {
  text-align: center;
}
.btn-pager {
  margin-left: 10px;
  padding: 0px;
  width: 60px;
  height: 30px;
  text-align: center;
  background-color: #ffffff;
  color: #000000;
  border: 1px solid #e3e3e3;
  border-radius: 0px;;
}
.btn-pager:hover {
  background-color: #f2f2f2;
}
.page-index {
  display: inline-block;
  margin-left: 10px;
  width: 35px;
  height: 30px;
  line-height: 30px;
  background-color: #ffffff;
  cursor: pointer;
  color: #000000;
}
.active {
  color: #ffffff;
  background-color: #0bbe06;
}
</style>

配合父組件使用

<pagination :page-no="pageNo" :current.sync="currentPage"></pagination>
// 從父組件使用該分頁組件的地方傳遞總頁碼pageNo
// 父組件與該分頁組件雙向綁定current
// 使用currentPage 來更新頁面需要的數(shù)據(jù)
  watch: {
    currentPage: 'requestData'
  },
  ready () {
    this.requestData()
  },
  data () {
    return {
      currentPage: 1
    }
  },
  methods: {
    requestData () {
      // 在這里使用ajax或者fetch將對應(yīng)頁傳過去獲取數(shù)據(jù)即可
    }
  }

完成后的效果圖:

分頁組件
分頁組件
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末疙筹,一起剝皮案震驚了整個(gè)濱河市富俄,隨后出現(xiàn)的幾起案子禁炒,更是在濱河造成了極大的恐慌,老刑警劉巖霍比,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件幕袱,死亡現(xiàn)場離奇詭異,居然都是意外死亡悠瞬,警方通過查閱死者的電腦和手機(jī)们豌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浅妆,“玉大人望迎,你說我怎么就攤上這事×柰猓” “怎么了辩尊?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長康辑。 經(jīng)常有香客問我摄欲,道長,這世上最難降的妖魔是什么疮薇? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任胸墙,我火速辦了婚禮,結(jié)果婚禮上按咒,老公的妹妹穿的比我還像新娘劳秋。我一直安慰自己,他們只是感情好胖齐,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布玻淑。 她就那樣靜靜地躺著,像睡著了一般呀伙。 火紅的嫁衣襯著肌膚如雪补履。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天剿另,我揣著相機(jī)與錄音箫锤,去河邊找鬼。 笑死雨女,一個(gè)胖子當(dāng)著我的面吹牛谚攒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播氛堕,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼馏臭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了讼稚?” 一聲冷哼從身側(cè)響起括儒,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤绕沈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后帮寻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乍狐,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年固逗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了浅蚪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡烫罩,死狀恐怖掘鄙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情嗡髓,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布收津,位于F島的核電站饿这,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏撞秋。R本人自食惡果不足惜长捧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吻贿。 院中可真熱鬧串结,春花似錦、人聲如沸舅列。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帐要。三九已至把敞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間榨惠,已是汗流浹背奋早。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赠橙,地道東北人耽装。 一個(gè)月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像期揪,于是被迫代替她去往敵國和親掉奄。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 前言 分頁其實(shí)很容易實(shí)現(xiàn)凤薛,我自己寫了一個(gè)簡單的分頁組件挥萌,可以實(shí)現(xiàn)上下翻頁绰姻,輸入頁碼跳轉(zhuǎn)到指定頁,刷新頁面后不會回到...
    大柚子08閱讀 2,388評論 0 2
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,262評論 25 707
  • 分頁組件:** 功能:點(diǎn)擊頁面序號可以跳轉(zhuǎn)到相應(yīng)頁面引瀑。點(diǎn)擊上一頁或者下一頁狂芋,當(dāng)頁面在第一頁時(shí)候上一頁無法點(diǎn)...
    穆熙沐閱讀 1,037評論 2 9
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件憨栽、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,117評論 4 61
  • 為什么就不寫呢 我心里很清楚寫作一篇文章是多么讓人愉悅的事帜矾,曾經(jīng)我有過那種美好的感覺。小學(xué)五年級的時(shí)候屑柔,我參加鄉(xiāng)里...
    張偉521閱讀 566評論 0 0