<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Vue Hook 封裝通用型表格

      一、創建通用型表格的需求

      實現一個通用型表格組件,具備以下功能:

      1. 動態列配置。
      2. 分頁功能。
      3. 排序功能。
      4. 可擴展的行操作功能。

      二、設計通用型表格組件

      首先,需要設計一個基礎的表格組件,它接受列配置、數據和分頁信息等參數。

      1. 創建 useTable Hook

      src/hooks 目錄下創建 useTable.js 文件:

      import { ref, reactive, onMounted, toRefs } from 'vue';
      
      export function useTable(fetchData) {
        const state = reactive({
          loading: false,
          data: [],
          pagination: {
            currentPage: 1,
            pageSize: 10,
            total: 0,
          },
          sort: {
            field: '',
            order: '',
          },
        });
      
        const loadData = async () => {
          state.loading = true;
          const { currentPage, pageSize } = state.pagination;
          const { field, order } = state.sort;
          const result = await fetchData(currentPage, pageSize, field, order);
          state.data = result.data;
          state.pagination.total = result.total;
          state.loading = false;
        };
      
        const changePage = (page) => {
          state.pagination.currentPage = page;
          loadData();
        };
      
        const changePageSize = (size) => {
          state.pagination.pageSize = size;
          loadData();
        };
      
        const changeSort = (field, order) => {
          state.sort.field = field;
          state.sort.order = order;
          loadData();
        };
      
        onMounted(() => {
          loadData();
        });
      
        return {
          ...toRefs(state),
          loadData,
          changePage,
          changePageSize,
          changeSort,
        };
      }

       

       

      2. 創建 TableComponent.vue

      src/components 目錄下創建 TableComponent.vue 文件:

      <template>
        <div>
          <table>
            <thead>
              <tr>
                <th v-for="col in columns" :key="col.key" @click="changeSort(col.key)">
                  {{ col.title }}
                  <span v-if="sort.field === col.key">{{ sort.order === 'asc' ? '↑' : '↓' }}</span>
                </th>
              </tr>
            </thead>
            <tbody>
              <tr v-for="row in data" :key="row.id">
                <td v-for="col in columns" :key="col.key">{{ row[col.key] }}</td>
              </tr>
            </tbody>
          </table>
          <div class="pagination">
            <button @click="changePage(pagination.currentPage - 1)" :disabled="pagination.currentPage === 1">Previous</button>
            <span>{{ pagination.currentPage }} / {{ Math.ceil(pagination.total / pagination.pageSize) }}</span>
            <button @click="changePage(pagination.currentPage + 1)" :disabled="pagination.currentPage === Math.ceil(pagination.total / pagination.pageSize)">Next</button>
          </div>
        </div>
      </template>
      
      <script>
      import { ref, onMounted } from 'vue';
      import { useTable } from '@/hooks/useTable';
      
      export default {
        props: {
          fetchData: {
            type: Function,
            required: true,
          },
          columns: {
            type: Array,
            required: true,
          },
        },
        setup(props) {
          const { data, loading, pagination, sort, loadData, changePage, changePageSize, changeSort } = useTable(props.fetchData);
      
          return {
            data,
            loading,
            pagination,
            sort,
            loadData,
            changePage,
            changePageSize,
            changeSort,
          };
        },
      };
      </script>
      
      <style scoped>
      .pagination {
        display: flex;
        justify-content: center;
        margin-top: 10px;
      }
      </style>

       

      三、使用通用型表格組件

      在實際項目中,可以這樣使用這個通用型表格組件:

      1. 創建 ExampleTable.vue 組件

      src/views 目錄下創建 ExampleTable.vue 文件:

      <template>
        <div>
          <TableComponent :fetchData="fetchData" :columns="columns" />
        </div>
      </template>
      
      <script>
      import TableComponent from '@/components/TableComponent.vue';
      
      export default {
        components: {
          TableComponent,
        },
        setup() {
          const columns = [
            { key: 'name', title: 'Name' },
            { key: 'age', title: 'Age' },
            { key: 'email', title: 'Email' },
          ];
      
          const fetchData = async (page, pageSize, sortField, sortOrder) => {
            // 模擬數據獲取
            const total = 100;
            const data = Array.from({ length: pageSize }, (v, i) => ({
              id: (page - 1) * pageSize + i + 1,
              name: `Name ${(page - 1) * pageSize + i + 1}`,
              age: 20 + ((page - 1) * pageSize + i + 1) % 30,
              email: `user${(page - 1) * pageSize + i + 1}@example.com`,
            }));
            return { data, total };
          };
      
          return {
            columns,
            fetchData,
          };
        },
      };
      </script>

       

      四、解釋代碼

      1. 定義 useTable Hook

        • 使用 Vue 的 refreactive 定義表格狀態。
        • 定義 loadDatachangePagechangePageSizechangeSort 函數來處理數據加載和分頁、排序變化。
        • 使用 onMounted 生命周期鉤子在組件掛載時加載數據。
      2. 定義 TableComponent 組件

        • 接受 fetchDatacolumns 作為組件屬性。
        • 使用 useTable Hook 獲取表格數據和操作函數。
        • 渲染表格頭部、主體和分頁組件,并綁定相關事件。
      3. 使用通用型表格組件

        • ExampleTable.vue 中定義列配置和數據獲取函數。
        • 使用 TableComponent 并傳遞 fetchDatacolumns 屬性。

       

      posted @ 2024-08-01 20:04  最小生成樹  閱讀(328)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 狠狠躁日日躁夜夜躁欧美老妇| 国产一区二区三区黄色片| 精品人妻一区二区三区蜜臀| 亚洲理论在线A中文字幕| 国产三级精品片| 亚洲性线免费观看视频成熟| 内射囯产旡码丰满少妇| 亚洲天堂男人的天堂在线| 国产午夜精品在人线播放| 一区二区三区AV波多野结衣| 军人粗大的内捧猛烈进出视频| 国产一区二区三区精品片| 最近2019中文字幕免费看| 白嫩少妇无套内谢视频| 国产成人一区二区免av| 欧洲尺码日本尺码专线美国又| 国产成人啪精品视频免费网 | 久久综合狠狠综合久久激情| 另类专区一区二区三区| 国产人妇三级视频在线观看| 色国产视频| 久久热精品视频在线视频| 99久久精品久久久久久婷婷| 宝贝腿开大点我添添公视频免| 国产午夜福利视频在线| 国产网友愉拍精品视频手机| 成人片黄网站色大片免费| 粉嫩国产av一区二区三区| 天堂资源在线| 福利视频一区二区在线| 息烽县| 玩弄放荡人妻少妇系列| 国内精品久久人妻无码网站| 加勒比无码人妻东京热| 精品人妻少妇嫩草av系列| 四虎影院176| 亚洲人成自拍网站在线观看| 成人精品日韩专区在线观看| 亚洲AV日韩AV激情亚洲 | 国产成人无码午夜视频在线观看| 99国产精品欧美一区二区三区|