vue 多頁面開發(fā)分頁組件 有搜索功能

前言

需要具備父子組件通信的知識 不知道的可以看我的筆記了解--里面的第26绣夺、27條

  • 多頁面結構截圖
image.png
  • 效果 gif 圖
Animation47.gif

正文

分頁組件源碼

  1. 新建分頁 .vue 文件 src -> components -> pagination -> index.vue,編輯 index.vue 文件
<template>
<div>
    <!-- 分頁 -->
    <nav aria-label="Page navigation" class="text-center">
        <ul class="pagination">
            <li  @click="previousGo">
              <a href="javascript:void(0);" aria-label="Previous">
                  <span aria-hidden="true">&laquo;</span>
              </a>
            </li>
                        <li v-for="(page,index) in pages" :key="index" @click="pageGo(page)" :class="{ 'active' : page === pageNumber}">
                            <a href="javascript:void(0);">{{ page }}</a>
                        </li>
            <li @click="nextGo">
              <a href="javascript:void(0);" aria-label="Next">
                  <span aria-hidden="true">&raquo;</span>
              </a>
            </li>
        </ul>
    </nav>
</div>
</template>

<script>
// import qs from 'qs' // 解決 axios 數(shù)據(jù)提交格式與后臺不一致的問題  -> name=hehe&age=10
export default {
  props: ['parentPageData'], // 父組件數(shù)據(jù) 別名
  name: 'Pagination',
  data() {
    return {
      // 當前頁碼
      pageNumber: null,
      // 分頁展示數(shù)量
      pageSize: null,
      // 數(shù)據(jù)總數(shù)量
      totalRow: null,
      // 頁碼數(shù)組
      pages: []
    }
  },
  watch: {
    // 監(jiān)聽父組件數(shù)據(jù)變化實時更新數(shù)據(jù)
    parentPageData: {
      handler: 'loadPageList',
      immediate: true
    }
  },
  methods: {
    // 轉換數(shù)據(jù)
    transformPageData: function() {
      const me = this
      const pagePlugin = me.$parent.$data.pagePlugin
      // console.log(pagePlugin)
      me.pageNumber = pagePlugin.pageNumber
      me.pageSize = pagePlugin.pageSize
      me.totalRow = pagePlugin.totalRow
    },
    // 加載頁面數(shù)據(jù)
    loadPageList: function() {
      // 頁碼數(shù)組
      const me = this
      me.transformPageData()
      let _length = me.pageSize // 每頁數(shù)量 & 頁碼列表總長度
      let _page = me.pageNumber // 當前頁面
      let _max = Math.ceil(me.totalRow / _length) // 最多的頁碼數(shù)字
      // console.log(_length + ' ' + _page + ' ' + _max)

      // 不是首次請求頁碼操作
      // 增加:判斷頁面長度是否為  頁碼列表總長度 修復 bug唯竹,bug 說明:如果當前搜索成功之后乐导,但是頁碼數(shù)量少于 頁碼列表總長度 ,比如兩頁浸颓,之后將搜索框內(nèi)容手動刪除物臂,再點擊分頁會出現(xiàn)請求到的數(shù)據(jù)已更新為全部,但是分頁列表數(shù)組 length 還是 2 導致的 bug
      if (_page !== 1 && me.pages.length === _length) {
        if (_page === me.pages[0]) {
          // 當前頁碼數(shù)是數(shù)組中的第一個頁碼
          me.pages.pop() // 刪除數(shù)組中最后一個元素
          me.pages.unshift(me.pageNumber - 1) // 向第一個元素前面追加一個元素
          return false
        } else if (_page === me.pages[me.pages.length - 1] && _page !== _max) {
          // 當前頁碼數(shù)是數(shù)組中的最后一個頁碼 且這個值不是總頁碼的最后一頁
          me.pages.shift() // 刪除數(shù)組中第一個元素
          me.pages.push(me.pageNumber + 1) // 向末尾增加一個元素
          return false
        } else if (me.pages.indexOf(_page) > -1) {
          // 當前的頁碼數(shù)存在于當前的頁碼數(shù)組中 不會向下重新拼接數(shù)組
          return false
        }
      }
      // 拼接頁碼操作
      let arr = []
      // 如果總頁碼不足 10 頁 循環(huán)次數(shù)為頁碼數(shù)
      if (_max < 10) _length = _max
      // 當前頁面已經(jīng)是最后一頁 倒數(shù)排列
      if (_page >= _max) {
        while (_length--) {
          arr.push(_page--)
        }
        arr.reverse()
      } else {
        while (_length--) {
          arr.push(_page++)
        }
      }
      me.pages = arr
    },
    // 分頁點擊
    pageGo: function(number) {
      const me = this
      // 點擊的是當前頁碼 return
      if (me.pageNumber === number) return
      me.$parent.$data.pagePostData.page_number = number
      me.pageNumber = number
      // 調用父組件方法
      me.$emit('updatePageData')
      // me.transformPageData()
      // me.loadPageList()
    },
    // 上一頁點擊
    previousGo: function() {
      const me = this
      // 當前頁碼為 1 return
      if (me.pageNumber === 1) {
        return false
      } else {
        me.pageGo(me.pageNumber - 1)
      }
    },
    // 下一頁點擊
    nextGo: function() {
      const me = this
      // 當前頁碼為 最后一頁 return
      if (me.pageNumber * me.pageSize >= me.totalRow) {
        return false
      } else {
        me.pageGo(me.pageNumber + 1)
      }
    }
  }
}
</script>

<style lang="less">
</style>

  1. 父組件相應的使用示例产上,多余的源碼已刪除
<template>
  <div class="container row">
    <div class="col-sm-10">
      <div class="row">
        <form class="navbar-form navbar-left col-sm-5" @submit.prevent="searchForm">
          <div class="form-group">
            <input type="text" class="form-control" placeholder="搜索" v-model="pagePostData.seach_name_phone">
          </div>
          <button type="submit" class="btn btn-default">搜索</button>
        </form>
        <div class="col-sm-7 text-right mtb-8">
          <button type="button" class="btn btn-primary" data-toggle="tooltip" data-placement="top" title="下載示例文件及相關操作">下載示例</button>
          <button type="button" class="btn btn-primary" data-toggle="tooltip" data-placement="top" title="">導出</button>
          <button type="button" class="btn btn-primary" data-toggle="tooltip" data-placement="top" title="" @click="openFilePopup">導入</button>
          <a href="addstaff.html" class="btn btn-link">新建成員</a>
          <a href="quitlist.html" class="btn btn-link">離職員工</a>
        </div>
      </div>
      <table class="table table-bordered">
        <caption>成員列表</caption>
        <thead>
          <tr>
            <th>&nbsp;&nbsp;</th>
            <th>姓名</th>
            <th>部門</th>
            <th>職位</th>
            <th>電話</th>
            <th>套餐</th>
            <th>授信額度</th>
            <th>狀態(tài)</th>
            <th>操作</th>
          </tr>
        </thead>
        <tbody>
          <tr v-for="(people,index) in pageGetData" :key="people.id">
            <td>
              <div class="custom-control custom-checkbox">
                <input class="form-check-input" type="checkbox" :id="'inlineCheckbox' + index">
              </div>
            </td>
            <td>{{ people.name }}</td>
            <td>{{ people.department }}</td>
            <td>{{ people.position }}</td>
            <td>{{ people.phone_number }}</td>
            <td>{{ people.package_code }}</td>
            <td>{{ people.balance }}</td>
            <td>{{ people.IS_USED }}</td>
            <td>
              <span>修改</span>
              <span>禁用</span>
              <span>移動</span>
              <span role="button" @click="leaveGo" :data-number="people.phone_number">離職</span>
              <span>詳情</span>
            </td>
          </tr>
        </tbody>
      </table>
      <div class="data-none" v-show="pageGetData.length === 0">暫無數(shù)據(jù)</div>
      <!-- 分頁 -->
      <pagination @updatePageData="loadPageData"  :parentPageData="pageGetData" v-show="pageGetData.length > 0"></pagination>
    </div>
    <!-- 彈窗 -->
    <msg-modal :modal-msg="modalMsg"></msg-modal>
  </div>
</template>

<script>
import qs from 'qs' // 解決 axios 數(shù)據(jù)提交格式與后臺不一致的問題  -> name=hehe&age=10
import MsgModal from '@/components/msgmodal'
import Pagination from '@/components/pagination'

export default {
  name: 'App',
  components: { MsgModal, Pagination },
  data() {
    return {
      // 彈窗信息 在執(zhí)行操作時使用
      modalMsg: '',
      // 信息提交接口
      pagePostAPI: '/jjhServerApi/ab/getAbByCondition',
      // 信息提交數(shù)據(jù)
      pagePostData: {
        /**
         * page_number 分頁頁數(shù)  不填默認為1
         * seach_name_phone 手機號或姓名 非必填  模糊查詢傳的條件
         */
        page_number: '',
        seach_name_phone: ''
      },
      // 頁面數(shù)據(jù)
      pageGetData: [],
      // 分頁組件參數(shù)
      pagePlugin: {
        // 當前頁碼
        pageNumber: '',
        // 分頁展示數(shù)量
        pageSize: '',
        // 數(shù)據(jù)總數(shù)量
        totalRow: ''
      }
    }
  },
  mounted() {
    const me = this
    // 初始化頁面數(shù)據(jù)
    me.loadPageData()
  },
  methods: {
    // 加載頁面所需的數(shù)據(jù)
    loadPageData: function() {
      const me = this
      // console.log(qs.stringify(me.pagePostData))
      me.axios
        .post(me.pagePostAPI, qs.stringify(me.pagePostData))
        .then(response => {
          // console.log(response)
          const getData = response.data
          if (getData.code === 0) {
            me.pageGetData = getData.result.list
            me.pagePostData.page_number = getData.result.pageNumber
            // 分頁數(shù)據(jù)轉換
            me.pagePlugin.pageNumber = getData.result.pageNumber
            me.pagePlugin.pageSize = getData.result.pageSize
            me.pagePlugin.totalRow = getData.result.totalRow
          } else {
            me.openAlertModel(getData.info)
          }
        })
        .catch(error => {
          console.log(error)
          me.openAlertModel('請求服務器失敗了棵磷,請稍后重試!')
        })
    },
    // 打開彈窗
    openAlertModel: function(message) {
      const me = this
      me.modalMsg = message
      $('#myModal').modal('show')
    },
    // 搜索表單提交
    searchForm: function() {
      const me = this
      // 頁碼重置為 1
      me.pagePlugin.pageNumber = me.pagePostData.page_number = 1
      me.loadPageData()
    }
  }
}
</script>

<style lang="less">
</style>

  • axios 掛載是在相應的 js 文件中
import Vue from 'vue'
import axios from 'axios'

Vue.prototype.axios = axios

總結

剛開始覺得還是蠻簡單的晋涣,后來發(fā)現(xiàn)最早時候寫的 bug 很多

  • 需要注意的地方(bug 產(chǎn)生的原因):
    • 搜索后要將 "頁碼重置為 1"
    • "如果當前搜索成功之后仪媒,但是頁碼數(shù)量少于 頁碼列表總長度 ,比如兩頁谢鹊,之后將搜索框內(nèi)容手動刪除算吩,再點擊分頁會出現(xiàn)請求到的數(shù)據(jù)已更新為全部,但是分頁列表數(shù)組 length 還是 2 導致的 bug"
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末佃扼,一起剝皮案震驚了整個濱河市偎巢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌兼耀,老刑警劉巖压昼,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異瘤运,居然都是意外死亡窍霞,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門拯坟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來但金,“玉大人,你說我怎么就攤上這事郁季“列澹” “怎么了掠哥?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長秃诵。 經(jīng)常有香客問我续搀,道長,這世上最難降的妖魔是什么菠净? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任禁舷,我火速辦了婚禮,結果婚禮上毅往,老公的妹妹穿的比我還像新娘牵咙。我一直安慰自己,他們只是感情好攀唯,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布洁桌。 她就那樣靜靜地躺著,像睡著了一般侯嘀。 火紅的嫁衣襯著肌膚如雪另凌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天戒幔,我揣著相機與錄音吠谢,去河邊找鬼。 笑死诗茎,一個胖子當著我的面吹牛工坊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播敢订,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼王污,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了楚午?” 一聲冷哼從身側響起昭齐,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎醒叁,沒想到半個月后司浪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體泊业,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡把沼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了吁伺。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饮睬。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖篮奄,靈堂內(nèi)的尸體忽然破棺而出捆愁,到底是詐尸還是另有隱情割去,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布昼丑,位于F島的核電站呻逆,受9級特大地震影響,放射性物質發(fā)生泄漏菩帝。R本人自食惡果不足惜咖城,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望呼奢。 院中可真熱鬧宜雀,春花似錦、人聲如沸握础。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽禀综。三九已至简烘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間菇存,已是汗流浹背夸研。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留依鸥,地道東北人亥至。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像贱迟,于是被迫代替她去往敵國和親姐扮。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,074評論 25 707
  • 國際課程近來受到許多家長及孩子的關注衣吠,特別是在當今茶敏,越來越多的家長開始注重對孩子素質教育與通才的教育培養(yǎng)意識上。 ...
    從容踐行閱讀 4,785評論 2 0
  • 我覺得活著好累缚俏。 真抱歉惊搏,只有遇到挫折心情不好的時候才會想起來這里。除了我自己忧换,身邊朋友沒人知道的一個地方恬惯。 有時...
    回艷嬌閱讀 164評論 0 0
  • 最是一年蔥蘢時。每年的三月亚茬,紫藤花期未至酪耳,只有滿眼的綠流溢而出。那滿眼的綠啊刹缝,如瀑碗暗,如泉颈将,如河,緩緩地言疗,緩緩...
    梅心梅飛閱讀 373評論 4 12
  • 有這樣一輛汽車晴圾,款式新穎、設計經(jīng)典噪奄、擁有漂亮的手工內(nèi)部裝飾疑务、手工制造的引擎以及世界頂級的動力系統(tǒng),當然它也...
    夢隨丹陽閱讀 331評論 0 2