NodeJs+Vue+MongoDB後臺管理系統模板(2)vue實現分頁

衆所周知的是,所有的後臺管理系統都離不開分頁,而傳統的分頁實現,更多的是同後端的進行交互,傳遞頁碼並返回當前頁所包含的數據,最終進行展示。這種做法存在的弊端就是用戶在進行頁碼切換的時候,後耗費大量的時間,同樣也會增加後端工程師的壓力,這一次我們通過vue實現分頁功能。

首先是數據問題,在node裏直接查詢所有的用戶返回給前臺。

// 獲取全部用戶信息
router.get('/userList',(req,res)=>{
    DB.find('user', {},(err, users)=>{
        if(err){
            res.send({
                code : 0 ,
                msg : '查詢失敗'
            });
            return
        }
        res.send({
            code:1,
            users:users
        });
    });
});

 在store的action裏定義了相關的獲取。

async getUsers({commit}){
    const result = await reqUsers();
    if(result.code === 1){
        const users = result.users;
        commit(RECEIVE_USER,{users})
    }
},

在mutation裏進行了數據的更新。

[RECEIVE_USER](state,{users}){
    state.users = users
},

 就這樣直接把所有用戶的信息放在了vuex裏進行了管理

 然後就是基本的HTML部分的內容了,大概說一下:判斷用戶的數量大於8的時候再顯示分頁的內容,在select裏遍歷每頁多少條數據的數組,用於調整每頁顯示數據條數,封裝跳轉頁碼的函數chengPages(),最後是一個找轉到指定頁碼的按鈕。大概的代碼如下。

<div class="page" v-if="users.length>8"><!--頁面分頁-->
    <ul>
        <li style="padding: 0">
            <label>
                <select class="selectPage" v-model="pageSize">
                    <option v-for="(pageData,index) in pageDataList" :value="pageData" :key="index">每頁{{pageData}}條</option>
                </select>
            </label>
        </li>
        <li @click="chengPages(1)">首頁</li>
        <li v-for="i in pages" :key="i" @click="chengPages(i)" :class="{'on': pageNum ===i }" v-if="i-pageNum>-3 && i-pageNum<3">{{ i }}</li>
        <li @click="chengPages(pages)">尾頁</li>
        <li><input class="choisePage" type="text" v-model="choise" @keyup.enter="chengPages(choise)"><span @click="chengPages(choise)">跳轉</span></li>
    </ul>
</div>

整體的樣式如下,具體的css就不進行展示了 。

 下面說一下頁面用到的東西:當前所在頁的頁碼數,默認爲1,每頁顯示的數據條數,我的默認值爲8,跳轉頁碼輸入值,默認爲空字符串,每頁顯示多少條數據的數組,一定要包含默認值,即pageSize。

data(){
    return{
        pageNum : 1, //當前頁數
        pageSize : 8, //每頁多少條數據
        choise:'',//跳轉頁數
        pageDataList:[2,4,8,10,15,20,30,50,100],//每頁數據量數組
    }    
}

下面就是相關的函數封裝了,它的主要功能就是控制顯示的頁碼,其中要加上相關的判斷,判斷是否小於1或大於總頁數,小於1的情況下調到第一頁,大於最大頁的情況下,調到最後一頁。

chengPages(number){ // 定義一個頁數跳轉函數
    number = number*1;
    if(number<=0){
        number = 1;
        this.choise = 1;
    }
    if(number>this.pages){
        number = this.pages;
        this.choise = this.pages;
    }
    this.pageNum = number
}

用的多的當屬計算屬性了,第一個在引入mapState的情況下,直接拿得到所有用戶的數據,接下來就是通過總用戶數,每頁顯示數據條數,計算出總頁數了,最後向上取整返回。重頭戲就是通過上面所提到的數據,生成一個包含當前頁數據的數組進行返回,最後在頁面上進行遍歷。

...mapState(['users']), //拿到所有的用戶數據
pages(){ //計算總共總共多少頁
    let number = 0;
    const allUser = this.users;
    const pageSize = this.pageSize;
    number = allUser.length/pageSize;
    return Math.ceil(number);
},
pageData(){ //當前頁顯示的數據
    let users = [];
    const pageNum = this.pageNum; //當前頁數
    const allUser = this.users; //所有用戶
    const pageSize = this.pageSize; //每頁多少條數據
    allUser.forEach((node,index)=>{
        if( index >= pageSize*(pageNum-1) && index < pageSize*pageNum){
            users.push(node)
        }
    });
    return users
},

其實到這裏已經差不多了,但是當每頁數據量少時,可以改變一個相對大一點的頁碼數,當再次調整每頁數據條數的時候,當前頁不會改變,計算出當前頁的數據爲空,爲了避免這種情況的發生,需要對當前頁數據進行監聽,當pageData的長度爲零時,直接跳轉到第一頁,避免問題發生。

watch: {
    pageData(value) { //監聽當前頁數據,數據沒有時跳轉第一頁
        if(value.length===0){
            this.pageNum = 1
        }
    }
}

這樣在進行頁面的跳轉的時候,就不會出現問題了。

最後想要完整代碼的,歡迎訪問我的GitHub,最好來個Star,哈哈。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章