中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Vue+Element UI+Lumen如何實現通用表格分頁功能

發布時間:2021-07-09 15:15:27 來源:億速云 閱讀:214 作者:小新 欄目:web開發

這篇文章主要為大家展示了“Vue+Element UI+Lumen如何實現通用表格分頁功能”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Vue+Element UI+Lumen如何實現通用表格分頁功能”這篇文章吧。

先說后端

后端做的事情不多,只需要接受幾個參數,根據參數來獲取數據即可。

需要獲取的參數如下:

  • pageSize(一頁數據的數量)

  • pageIndex(第幾頁的數據)

然后就可以根據這兩個參數計算出偏移量,再從數據庫中取出相應的數據。

假如現在給出的參數為:pageSize=10pageIndex = 2,也就是說每一頁要10條記錄,要第二頁。

計算偏移量的公式為:pageSize * (pageIndex - 1)

基本代碼如下:

public function getUser(Request $request){
 $pageSize = $request->input('pageSize');
 $pageIndex = $request->input('pageIndex');
 $offset = $pageSize * ($pageIndex - 1);
 return User::offset($offset)
    ->limit($pageSize)
    ->get();
}

后端基本上只需要做這么多,就可以完成一個分頁的功能了,但還是有幾處地方需要改進一下:

  • 給參數一個默認值

  • 前端還需要知道整個表的數據的總數

  • 把分頁做成一個公用的函數

改進后的代碼如下:

private $default_page_size = 30;
private $default_page_index = 1;

// 公用分頁
public function pagination($request, $list) {
 $pageSize = $request->input('pageSize', $this->default_page_size);
 $pageIndex = $request->input('pageIndex', $this->default_page_index);
 $offset = $pageSize * ($pageIndex - 1);
 $total = $list->count();
 $list = $list
   ->offset($offset)
   ->limit($pageSize);
 return [
 'list' => $list->get(),
 'total' => $total,
 ];
}

// 獲取用戶列表
public function getUser(Request $request) {
 $list = User::query();
 /*
  這里可以做一些查詢之類的操作
 */
 return $this->pagination($request, $list);
}

再說前端

前端相對于需要做的事情就比較多了,需要考慮幾點:

  • 獲取數據時需要帶上分頁的參數

  • 分頁參數需要進行本地持久化,以免刷新頁面回到第一頁(后端設置的默認值)

  • 同樣要抽象出一個通用的分頁組件

獲取數據

這里我們用 vuex來管理狀態,然后在請求時帶上分頁數據:

store.js:

注意:

  • 這里為了方便展示代碼,并沒有使用模塊化,項目中,最好將使用模塊化方便管理。

  • 這里默認讀者清楚 ES6 的語法

export default new vuex.Store({
 state : {
  user : {
   list: [],
   total: 0,
   pageIndex: 1,
   pageSize: 10,
  }
 },
 mutations: {
 updateUser(state, data) {
 state.user = {
 ...state.user,
 ...data,
 }
 }, 
 },
 actions: {
  async getUser({commit,state,getters}) {
   // $axios 只是我自己封裝的一個函數 這里并不重要
   const res = await $axios.get('/user',getters.requestData(state.user))
   commit('updateUser',res);
  },
 },
 getters:{
  requestData(state) {
   return (origin) => {
    const {
     pageIndex,
     pageSize,
    } = origin;
    const data = {
     pageIndex,
     pageSize,
    };
    return data;
   }
  },
 }
})

數據持久化

現在如何獲取數據已經搞定了,數據持久化我使用 vuex-localstorage,安裝后,只需要在上面代碼的基礎上添加:

import createPersist from 'vuex-localstorage'
export default new vuex.Store({
 // 接著上面的
 plugins: [createPersist({
  namespace: 'studio-user',
  initialState: {},
  // ONE_WEEK
  expires: 7 * 24 * 60 * 60 * 1e3
 })]
})

公用分頁組件

<template>
 <el-Pagination
 background
 layout="total, sizes, prev, pager, next, jumper"
 :total="module.total"
 :current-page.sync="module.pageIndex"
 :page-sizes="module.pageSizes"
 :page-size.sync="module.pageSize"
 @current-change="handleCurrentChange"
 @size-change="handleSizeChange"
 >
 </el-Pagination>
</template>
<script>
export default {
 props: {
 module: Object
 },
 methods: {
 getData() {
  this.$emit("get-data");
 },
 handleCurrentChange() {
  this.getData();
 },
 handleSizeChange(val) {
  this.getData();
 }
 }
};
</script>

使用分頁組件

<template>
 <div class="container">
 <el-table
  :data="user.list"
  
  >
  <el-table-column
   v-for="(item,index) in columns"
   :key="index"
   :prop="item.prop"
   :label="item.label"
   align="center"
  />
  </el-table>
  <pagination
  :module="user"
  @get-data="getData"
  />
 </div>
</template>
<script>
import Pagination from "@/common/components/Pagination";
import { mapActions, mapState } from "vuex";
export default {
 components: {
 Pagination,
 },
 data: () => ({
 columns: [
  {
  prop: "name",
  label: "姓名"
  },
  {
  prop: "性別",
  label: "sex"
  },
  {
  prop: "年齡",
  label: "age"
  },
 ]
 }),
 created() {
 this.getData();
 },
 methods: {
  ...mapActions({
   getData : "getUser",
  }) 
 },
 computed: {
 ...mapState(["user"])
 }
};
</script>

以上是“Vue+Element UI+Lumen如何實現通用表格分頁功能”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

赞皇县| 石楼县| 微山县| 灵武市| 台安县| 灯塔市| 新化县| 六安市| 太保市| 宣城市| 曲水县| 平舆县| 富宁县| 铜川市| 奉化市| 清徐县| 阿拉善盟| 红河县| 丁青县| 锡林郭勒盟| 龙陵县| 平凉市| 贵南县| 新源县| 镇安县| 夏邑县| 谷城县| 金山区| 观塘区| 织金县| 安义县| 视频| 大关县| 梨树县| 呈贡县| 灵璧县| 西乌| 遂平县| 盐津县| 海兴县| 靖安县|