最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue?Hook?封裝通用型表格的詳細過程

 更新時間:2024年08月02日 08:59:47   作者:最小生成樹  
這篇文章主要介紹了Vue?Hook?封裝通用型表格,設(shè)計通用型表格組件首先,需要設(shè)計一個基礎(chǔ)的表格組件,它接受列配置、數(shù)據(jù)和分頁信息等參數(shù),本文給大家介紹的非常詳細,需要的朋友可以參考下

一、創(chuàng)建通用型表格的需求

實現(xiàn)一個通用型表格組件,具備以下功能:

  • 動態(tài)列配置。
  • 分頁功能。
  • 排序功能。
  • 可擴展的行操作功能。

二、設(shè)計通用型表格組件

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

1. 創(chuàng)建 useTable Hook

在 src/hooks 目錄下創(chuàng)建 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. 創(chuàng)建 TableComponent.vue

在 src/components 目錄下創(chuàng)建 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. 創(chuàng)建 ExampleTable.vue 組件

在 src/views 目錄下創(chuàng)建 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) => {
      // 模擬數(shù)據(jù)獲取
      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>

四、解釋代碼

  • 定義 useTable Hook:

    • 使用 Vue 的 ref 和 reactive 定義表格狀態(tài)。
    • 定義 loadDatachangePage、changePageSize 和 changeSort 函數(shù)來處理數(shù)據(jù)加載和分頁、排序變化。
    • 使用 onMounted 生命周期鉤子在組件掛載時加載數(shù)據(jù)。
  • 定義 TableComponent 組件

    • 接受 fetchData 和 columns 作為組件屬性。
    • 使用 useTable Hook 獲取表格數(shù)據(jù)和操作函數(shù)。
    • 渲染表格頭部、主體和分頁組件,并綁定相關(guān)事件。
  • 使用通用型表格組件

    • 在 ExampleTable.vue 中定義列配置和數(shù)據(jù)獲取函數(shù)。
    • 使用 TableComponent 并傳遞 fetchData 和 columns 屬性。

到此這篇關(guān)于Vue Hook 封裝通用型表格的文章就介紹到這了,更多相關(guān)Vue Hook 封裝通用型表格內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue3使用md-editor-v3的實例解讀markdown文本

    Vue3使用md-editor-v3的實例解讀markdown文本

    本文介紹了如何在Vue3項目中使用md-editor-v3實現(xiàn)Markdown編輯器,包括基礎(chǔ)實現(xiàn)、工具欄自定義、預(yù)覽功能以及擴展功能
    2026-01-01
  • vue項目如何分環(huán)境部署

    vue項目如何分環(huán)境部署

    這篇文章主要介紹了vue項目如何分環(huán)境部署問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2018-12-12
  • Vue+Element-ui彈窗?this.$alert?is?not?a?function問題

    Vue+Element-ui彈窗?this.$alert?is?not?a?function問題

    這篇文章主要介紹了Vue+Element-ui彈窗?this.$alert?is?not?a?function問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • uni-app無限級樹形組件簡單實現(xiàn)代碼

    uni-app無限級樹形組件簡單實現(xiàn)代碼

    文章介紹了如何在uni-app中簡單封裝一個無限級樹形組件,該組件可以無線嵌套,展開和收縮,并獲取子節(jié)點數(shù)據(jù),本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友一起看看吧
    2025-01-01
  • vue學(xué)習(xí)筆記之Vue中css動畫原理簡單示例

    vue學(xué)習(xí)筆記之Vue中css動畫原理簡單示例

    這篇文章主要介紹了vue學(xué)習(xí)筆記之Vue中css動畫原理,結(jié)合簡單實例形式分析了Vue中css樣式變換動畫效果實現(xiàn)原理與相關(guān)操作技巧,需要的朋友可以參考下
    2020-02-02
  • vue實現(xiàn)集成騰訊TIM即時通訊

    vue實現(xiàn)集成騰訊TIM即時通訊

    最近在做商城類的項目,需要使用到客服系統(tǒng),用戶選擇的騰訊IM即時通信,所以本文主要介紹了vue實現(xiàn)集成騰訊TIM即時通訊,感興趣的可以了解一下
    2021-06-06
  • vue截圖轉(zhuǎn)base64轉(zhuǎn)文件File異步獲取方式

    vue截圖轉(zhuǎn)base64轉(zhuǎn)文件File異步獲取方式

    這篇文章主要介紹了vue截圖轉(zhuǎn)base64轉(zhuǎn)文件File異步獲取方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • 使用Vite搭建vue3+TS項目的實現(xiàn)步驟

    使用Vite搭建vue3+TS項目的實現(xiàn)步驟

    本文主要介紹了使用Vite搭建vue3+TS項目的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • uniapp中設(shè)置全局頁面背景色的簡單教程

    uniapp中設(shè)置全局頁面背景色的簡單教程

    uni-app如何設(shè)置頁面全局背景色,其實非常簡單,一句話即可,但有時候也會踩一些坑,這篇文章主要給大家介紹了關(guān)于uniapp中設(shè)置全局頁面背景色的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • Vue2+Elementui?Dialog實現(xiàn)封裝自定義彈窗組件

    Vue2+Elementui?Dialog實現(xiàn)封裝自定義彈窗組件

    在日常的管理系統(tǒng)界面中,我們寫的最多的除了列表表格之外,就是各種彈窗組件,本文就來為大家詳細介紹一下Vue2如何結(jié)合Elementui?Dialog實現(xiàn)封裝自定義彈窗組件,希望對大家有所幫助
    2023-12-12

最新評論

习水县| 高碑店市| 岳池县| 合阳县| 武川县| 图们市| 柯坪县| 旬阳县| 榆林市| 多伦县| 密云县| 漾濞| 昌江| 巩留县| 宜丰县| 藁城市| 象山县| 滦南县| 咸丰县| 南岸区| 古丈县| 四子王旗| 社会| 镇巴县| 浮梁县| 阿图什市| 通州市| 皋兰县| 伊金霍洛旗| 靖宇县| 剑川县| 鸡东县| 焦作市| 昂仁县| 花莲县| 镇平县| 城口县| 桓仁| 扎鲁特旗| 池州市| 蒙阴县|