node.js+mongoose+vue實(shí)現(xiàn)分頁

效果圖

先來個(gè)效果圖损话,如果覺得丑,就不用往下看了槽唾。。光涂。庞萍。


分頁.png

實(shí)驗(yàn)環(huán)境:

名稱 版本號(hào)
mongodb 3.5.3
node.js 9.1.0
Vue.js 2.5.6

詳細(xì)代碼

環(huán)境搭建我就不說了,直接說說思路吧忘闻。功能基本上就這些:

  1. 任意點(diǎn)擊某一頁
  2. 上一頁钝计,下一頁
  3. 前五頁, 后五頁
  4. 搜索任意頁
  5. 顯示總頁數(shù)
初始化

首先需要初始化從后臺(tái)拿到表中總的記錄數(shù)count,然后根據(jù)我們預(yù)先設(shè)定的page_size(每頁顯示多少條數(shù)據(jù))私恬,來計(jì)算出總的頁數(shù)(page_count)债沮。本文中,page_size=10, 頁碼表默認(rèn)是顯示5個(gè)本鸣。

data() {
      return {
        all_user_data: "",
        count: "",//總記錄數(shù)
        page_count: "",//總頁數(shù)
        page_size: 10,//每頁顯示記錄條數(shù)
        page_now: 1,//當(dāng)前頁
        page_num: null,//搜索頁
        list: []//頁碼表
      }
    },

 initpage() {
        this.api_name = this.$route.query.api_name;
        this.$http.get(this.GLOBAL.apiurl + "/api/" + this.api_name).then((response) => {
          console.log(response.body.data);
          this.all_user_data = response.body.data;
        });

        this.$http.get(this.GLOBAL.apiurl + "/api/" + this.api_name + "_count").then((response) => {
          console.log(response.body.data);
          this.count = response.body.data;
          this.page_count = Math.ceil(this.count / this.page_size);
          for (var i = 1; i <= this.page_count; i++) {
            this.list[i - 1] = i;
            if (i >= 5) {
              break;
            }
          }
        });
      },

這里計(jì)算總頁數(shù)的時(shí)候要注意疫衩,如果最后一頁不夠10條數(shù)據(jù),也要計(jì)算在內(nèi)

this.page_count = Math.ceil(this.count / this.page_size);

所以我們用(count/page_size)然后整個(gè)向上取整計(jì)算出總的頁數(shù)荣德。注意啊闷煤,js中''/''計(jì)算的結(jié)果不是整數(shù),而是小數(shù)涮瞻。鲤拿。。
這里總共向后臺(tái)發(fā)了兩個(gè)請(qǐng)求署咽,一個(gè)是拿回第一頁的10條數(shù)據(jù)近顷,一個(gè)是拿到總的記錄數(shù),初始化頁碼表宁否。來看看后臺(tái)這兩個(gè)函數(shù)

apiRoutes.get('/你自己的url', function (req, res) {
    console.log("--------------------------------------------------");
    let page_now = req.query.page_now;
    console.log(page_now);
    Student.MFindAllStudents(page_now, function (err, students) {
        if (err) {
            res.json({
                errno: 1,
                tips: "查詢所有學(xué)生操作異常"
            })
        }
        else {
            res.json({
                errno: 0,
                data: students
            })
        }
    })
});

apiRoutes.get('/你自己請(qǐng)求的url', function (req, res) {
    console.log("--------------------------------------------------");
    Student.MCountAllStudents(function (err, count) {
        if (err) {
            res.json({
                errno: 1,
                tips: "查詢總數(shù)操作異常"
            })
        }
        else {
            res.json({
                errno: 0,
                data: count
            })
        }
    })
});
exports.MFindAllStudents = function(page_now, callback){
    Student.find(function(err,student){
        callback(err,student);
    }).limit(10).skip(page_now*10);
};

exports.MCountAllStudents = function(callback){
    Student.count(function(err,count){
        callback(err,count);
    });
};

Student是表的映射窒升,后臺(tái)使用了mongoose模塊來做數(shù)據(jù)庫操作,在find語句后面加上
limit(10).skip(1)就代表從第一頁開始顯示家淤,每頁顯示10條數(shù)據(jù)异剥。這個(gè)就是分頁的核心了,所有的操作都是在調(diào)這個(gè)函數(shù)絮重。

好了冤寿,現(xiàn)在對(duì)應(yīng)著每一個(gè)功能來看

  1. 任意點(diǎn)擊某一頁
click_page: function (page_now) {
        let data = {page_now: page_now - 1};
        this.api_name = this.$route.query.api_name;
        this.$http.get(this.GLOBAL.apiurl + "/api/" + this.api_name, {params: data}).then((response) => {
          console.log(response.body.data);
          this.all_user_data = response.body.data;
        });
        this.page_now = page_now;
 },

將 當(dāng)前頁碼-1 傳到后臺(tái),為啥減1不談了青伤,看看上面的skip機(jī)制就知道了督怜。

  1. 上一頁,下一頁
click_next_one: function () {
        if (this.page_now * this.page_size < this.count) {
          if (this.page_now === this.list[this.list.length - 1]) {
            for (var i = 0; i < this.list.length; i++) {
              this.list[i] += 1;
            }
          }
          this.page_now += 1;
          this.click_page(this.page_now)
        } else {
          alert("已到最后一頁");
        }
  },

 click_pre_one: function () {
        if (this.page_now > 1) {
          if (this.page_now === this.list[0]) {
            for (var i = 0; i < this.list.length; i++) {
              this.list[i] -= 1;
            }
          }
          this.page_now -= 1;
          this.click_page(this.page_now)
        } else {
          alert("已到第一頁");
        }
  },

先看下一頁狠角,如果是末頁的話沒有下一頁号杠,所以先來一個(gè)過濾。然后這個(gè)循環(huán)體主要是實(shí)現(xiàn)了這么一個(gè)效果丰歌,就是當(dāng)前頁是頁碼表的最后一頁時(shí)(比如第5頁)姨蟋,下一頁之后會(huì)使頁碼表每個(gè)都后延一個(gè)數(shù),看圖:


下一頁1.png

下一頁2.png

上一頁的情況是一樣的立帖,注意的是眼溶,不用再向后臺(tái)請(qǐng)求數(shù)據(jù),只需要調(diào)用已經(jīng)寫好的click_page函數(shù)即可晓勇。

  1. 前五頁堂飞, 后五頁
     click_pre_more: function () {
        if (this.list[0] > 5) {
          for (var i = 0; i < this.list.length; i++) {
            this.list[i] -= this.list.length;
          }

          this.page_now -= this.list.length;
          this.click_page(this.page_now);
        } else {
          this.click_pre_one();
        }
      },

      click_next_more: function () {
        //如果每行第一個(gè)數(shù)加9超了灌旧,意味著最后一頁會(huì)出現(xiàn)不夠的情況,那就執(zhí)行下一頁
        if (this.list[0] + this.page_size-1 <= this.page_count) {
          for (var i = 0; i < this.list.length; i++) {
            this.list[i] += this.list.length;
          }
          this.page_now += this.list.length;
          this.click_page(this.page_now);
        } else {
          this.click_next_one();
        }
      }

正常情況時(shí)绰筛,點(diǎn)擊后5頁會(huì)使頁碼表更新枢泰,每個(gè)延后5個(gè)位置,并且當(dāng)前頁也會(huì)延后5個(gè)位置铝噩,效果:


后5頁1.png

后5頁2.png

特殊情況衡蚂,最后不夠5頁了怎么辦,最好的應(yīng)該是薄榛,最后還剩幾頁就顯示幾頁讳窟,可以我沒找到合適的解決方案,就用了另一種方案代替:不夠5頁時(shí)就去調(diào)下一頁敞恋。效果:


后5頁3.png

后5頁4.png

那前五頁的效果跟這個(gè)是一樣的丽啡,只不過判斷條件變了以下而已,就不多說了硬猫。

  1. 搜索任意頁
click_page_search: function (page_num) {
        if (page_num <= this.page_count && page_num > 0) {
          this.click_page(page_num);
          //正常情況時(shí)补箍,搜索頁碼顯示在頁碼表的首位
          if (page_num + this.list.length - 1 <= this.page_count) {
            for (var i = 0; i < this.list.length; i++) {
              this.list[i] = page_num + i;
            }
          }else {
            for (var i = 0; i < this.list.length; i++) {
              this.list[this.list.length-1-i] = page_num - i ;
            }
          }//特殊情況時(shí),搜索頁碼顯示在頁碼表的末位
        } else {
          alert("兄臺(tái)啸蜜,并沒有這一頁...");
        }
        this.page_num = "";
  },

這個(gè)搜索倒是很簡(jiǎn)單坑雅,直接調(diào)click_page就行了,關(guān)鍵是你的頁碼表得跟著更新啊衬横。裹粤。。
/正常情況時(shí)蜂林,搜索頁碼顯示在頁碼表的首位(避免了第一頁的位置不在頁碼表的首位)
效果:


搜索頁1.png

特殊情況遥诉,即搜索頁是最后4頁時(shí),搜索頁碼顯示在頁碼表的末位(避免了最后不夠5頁的情況)噪叙。效果:


搜索頁2.png

總結(jié):

基本上就是這樣了矮锈,算法太差了,寫的很亂睁蕾,總是用一些很笨的方法來補(bǔ)救苞笨。。子眶。希望以后能有更好的解決方案
樣式是引用了這位前輩的帖子瀑凝,非常感謝
Html5實(shí)現(xiàn)自己的分頁加載

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市臭杰,隨后出現(xiàn)的幾起案子猜丹,更是在濱河造成了極大的恐慌,老刑警劉巖硅卢,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件射窒,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡将塑,警方通過查閱死者的電腦和手機(jī)脉顿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來点寥,“玉大人艾疟,你說我怎么就攤上這事「冶纾” “怎么了蔽莱?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)戚长。 經(jīng)常有香客問我盗冷,道長(zhǎng),這世上最難降的妖魔是什么同廉? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任仪糖,我火速辦了婚禮,結(jié)果婚禮上迫肖,老公的妹妹穿的比我還像新娘锅劝。我一直安慰自己,他們只是感情好蟆湖,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布故爵。 她就那樣靜靜地躺著,像睡著了一般隅津。 火紅的嫁衣襯著肌膚如雪诬垂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天饥瓷,我揣著相機(jī)與錄音剥纷,去河邊找鬼。 笑死呢铆,一個(gè)胖子當(dāng)著我的面吹牛晦鞋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播棺克,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼悠垛,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了娜谊?” 一聲冷哼從身側(cè)響起确买,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎纱皆,沒想到半個(gè)月后湾趾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芭商,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年搀缠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了铛楣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡艺普,死狀恐怖簸州,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情歧譬,我是刑警寧澤岸浑,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站瑰步,受9級(jí)特大地震影響矢洲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜面氓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一兵钮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧舌界,春花似錦掘譬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蝶涩。三九已至橙凳,卻和暖如春姐军,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留袜炕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓初家,卻偏偏與公主長(zhǎng)得像偎窘,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子溜在,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,510評(píng)論 25 707
  • 方法一:使用pure_pagination進(jìn)行分頁 1. pure_pagination介紹 pure_pagin...
    Jlan閱讀 1,116評(píng)論 0 7
  • Vonnie|2012-02-04|交互設(shè)計(jì) 說說目前常用的三種分類顯示信息方法: 常規(guī)翻頁 信息滾動(dòng)翻頁 滾動(dòng)條...
    楚木風(fēng)起閱讀 2,755評(píng)論 0 2
  • 我?guī)е髮毘鋈ネ嫠D爸炖锬钸吨乙液没锇橥嬉蠢撸聦?shí)上仆葡,因?yàn)樗鲩T比較晚,已經(jīng)8點(diǎn)半多了志笼,顯然同小區(qū)的小伙伴...
    豆蔻媽閱讀 152評(píng)論 0 0
  • 今天是這個(gè)寒假在這個(gè)城市的最后一天沿盅。還有十分鐘把篓,就要搬箱子下樓坐車走了。 聽著《你的名字》里三葉的音樂嗡呼。安靜的鋼琴...
    轉(zhuǎn)凌閱讀 486評(píng)論 0 0