iT邦幫忙

2022 iThome 鐵人賽

DAY 9
0

這篇文章是接續昨天的部分
今天主要是欣賞一下程式碼

官方文件

非常簡潔有力(資訊好少)
https://pure-admin-doc.vercel.app/pages/pure-admin-table/#%F0%9F%9A%80-%E7%89%B9%E6%80%A7

有找到pagination分頁系統的參數註解
\pure-admin-thin\node_modules\.pnpm\@pureadmin+table@1.2.0_element-plus@2.2.16\node_modules\@pureadmin\table\dist\types\index.d.ts

TLTR

作者封裝了很多套件真的很厲害!
但是部分套件沒有特別花時間撰寫詳細的說明文件,今天實際使用@pureadmin/table傳參數<PaginationProps>有遇到 bug (例如: pagination.layout = [1, 5, 10, 15, 20] 畫面的分頁直接消失,也沒有錯誤資訊)
/images/emoticon/emoticon02.gif
筆者認為使用原生的 element-plus 組件比較好掌控,網路上資源也比較多!比較改的動。

  • <TableProBar>
    • 來源 /@/components/ReTable
    • 負責 Table bar (放表格標題,共用設定,按鈕等等),也可以客製化新增按鈕等等
  • <PureTable>
    • 來源 @pureadmin/table
    • 負責 Table 內容,核心目標是把 Table 的 header, data, pagination 個別抽離

畫面


可以點選齒輪把"勾選列"功能打開

程式碼

index.vue

  <!-- \pure-admin-thin\src\views\system\role\index.vue -->
<script setup lang="ts">
import { useColumns } from "./columns";
import { getRoleList } from "/@/api/system";
import { reactive, ref, onMounted } from "vue";
import { TableProBar } from "/@/components/ReTable";
import { PaginationProps } from "@pureadmin/table";
import { useRenderIcon } from "/@/components/ReIcon/src/hooks";

//一定要引入
import { PureTable } from "@pureadmin/table";

defineOptions({
  name: "Role"
});

//打 API 去拿的 Table 資料 [{},{},...]
let dataList = ref([]);
//紀錄 loading 狀態
let loading = ref(true);
//等於 Table 的 header, 放在另一隻檔案 (沒有用到 store)
const { columns } = useColumns();

// 分頁功能 需要的變數
const pagination = reactive<PaginationProps>({
//預設每頁顯示多少筆
  defaultPageSize: 1,
//預設在哪一頁  
  defaultCurrentPage: 1,
//總共多少筆資料  
  total: 0,
//每頁顯示多少筆  
  pageSize: 1,
//當前頁數在哪一頁  
  currentPage: 1
});

//打 API 拿資料後,更新 Table 相關變數
async function onSearch() {
  loading.value = true;
  let { data } = await getRoleList();
  dataList.value = data.list;
  pagination.total = data.total;
  setTimeout(() => {
    loading.value = false;
  }, 500);
}

// console 印出目前在第幾頁
function handleCurrentChange(val: number) {
  console.log(`current page: ${val}`);
}

//console 印出目前 pagination 相關參數
function handleSizeChange(val: number) {
  console.log(`${val} items per page`);
  console.log(
    pagination.total,
    pagination.pageSize,
    pagination.currentPage
  );
}

//勾選列功能打開後, console 能印出勾選資料
function handleSelectionChange(val) {
  console.log("handleSelectionChange", val);
}

onMounted(() => {
  onSearch();
});
</script>

<template>
  <div class="main">
    <TableProBar
      title="角色列表"
      :loading="loading"
      :dataList="dataList"
      @refresh="onSearch"
    >
      <template #buttons>
        <el-button type="primary" :icon="useRenderIcon('add')">
          新增角色
        </el-button>
      </template>
      <template v-slot="{ size, checkList }">
        <PureTable
          border
          align="center"
          showOverflowTooltip
          table-layout="auto"
          size="small"
          :data="dataList"
          :columns="columns"
          :checkList="checkList"
          :pagination="pagination"
          :paginationSmall="size === 'small' ? true : false"
          :header-cell-style="{
            background: 'var(--el-table-row-hover-bg-color)',
            color: 'var(--el-text-color-primary)'
          }"
          @selection-change="handleSelectionChange"
          @size-change="handleSizeChange"
          @current-change="handleCurrentChange"
        />
      </template>
    </TableProBar>
  </div>
</template>


handleSelectionChange()
圖二

columns.tsx

 //\pure-admin-thin\src\views\system\role\columns.tsx
 
import { ref } from "vue";
import dayjs from "dayjs";
//引入 elemt-plus 對話框
import { ElMessageBox } from "element-plus";
//引入 作者客製化封裝的 表格內部開關 和 簡易提示框
import { Switch, message } from "@pureadmin/components";

export function useColumns() {
  const switchLoadMap = ref({});

//表格 header 可以客製化渲染內容
  const columns = ref([
    {
      type: "selection",
      width: 55,
      hide: ({ checkList }) => !checkList.includes("勾选列")
    },
    {
      label: "序号",
      type: "index",
      width: 70,
      hide: ({ checkList }) => !checkList.includes("序号列")
    },
    {
      label: "角色编号",
      prop: "id"
    },
    {
      label: "角色名称",
      prop: "name"
    },
    {
      label: "角色标识",
      prop: "code"
    },
    {
      label: "角色类型",
      prop: "type",
      cellRenderer: ({ row, props }) => (
        <el-tag
          size={props.size}
          type={row.type === 1 ? "danger" : ""}
          effect="plain"
        >
          {row.type === 1 ? "内置" : "自定义"}
        </el-tag>
      )
    },
    {
      label: "显示顺序",
      prop: "sort"
    },
    {
      label: "状态",
      prop: "status",
      width: 130,
      cellRenderer: scope => (
        <Switch
          size={scope.props.size === "small" ? "small" : "default"}
          loading={switchLoadMap.value[scope.index]?.loading}
          v-model:checked={scope.row.status}
          checkedValue={1}
          unCheckedValue={0}
          checked-children="已开启"
          un-checked-children="已关闭"
          onChange={() => onChange(scope)}
        />
      )
    },
    {
      label: "创建时间",
      width: 180,
      prop: "createTime",
      formatter: ({ createTime }) =>
        dayjs(createTime).format("YYYY-MM-DD HH:mm:ss")
    }
  ]);

//在label: "状态" 欄位變更後會呼叫此方法
  function onChange({ row, index }) {
    ElMessageBox.confirm(
      `确认要<strong>${
        row.status === 0 ? "停用" : "启用"
      }</strong><strong style='color:var(--el-color-primary)'>${
        row.name
      }</strong>角色吗?`,
      "系统提示",
      {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning",
        dangerouslyUseHTMLString: true,
        draggable: true
      }
    )
      .then(() => {
        switchLoadMap.value[index] = Object.assign(
          {},
          switchLoadMap.value[index],
          {
            loading: true
          }
        );
        setTimeout(() => {
          switchLoadMap.value[index] = Object.assign(
            {},
            switchLoadMap.value[index],
            {
              loading: false
            }
          );
          message.success("已成功修改角色状态");
        }, 300);
      })
      .catch(() => {
        row.status === 0 ? (row.status = 1) : (row.status = 0);
      });
  }

  return {
    columns
  };
}

onChange()
圖三

如果要新增表格資料要去哪?

因為我們是使用假資料 (mock)
要去下圖處新增資料
mock


上一篇
第八天 把喜歡的vue-pure-admin頁面 加到 pure-admin-thin {{實戰}}
下一篇
第十天 略懂 pure-admin 的 Layout 架構
系列文
教練我想做一個後台管理系統,阿我忘記我只有一個人沒有教練,那用試著以vue-pure-admin為基底做做看31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言