Vue?Hook?封裝通用型表格的詳細過程
一、創(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>四、解釋代碼
定義
useTableHook:- 使用 Vue 的
ref和reactive定義表格狀態(tài)。 - 定義
loadData、changePage、changePageSize和changeSort函數(shù)來處理數(shù)據(jù)加載和分頁、排序變化。 - 使用
onMounted生命周期鉤子在組件掛載時加載數(shù)據(jù)。
- 使用 Vue 的
定義
TableComponent組件:- 接受
fetchData和columns作為組件屬性。 - 使用
useTableHook 獲取表格數(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實現(xiàn)Markdown編輯器,包括基礎(chǔ)實現(xiàn)、工具欄自定義、預(yù)覽功能以及擴展功能2026-01-01
Vue+Element-ui彈窗?this.$alert?is?not?a?function問題
這篇文章主要介紹了Vue+Element-ui彈窗?this.$alert?is?not?a?function問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10
vue學(xué)習(xí)筆記之Vue中css動畫原理簡單示例
這篇文章主要介紹了vue學(xué)習(xí)筆記之Vue中css動畫原理,結(jié)合簡單實例形式分析了Vue中css樣式變換動畫效果實現(xiàn)原理與相關(guān)操作技巧,需要的朋友可以參考下2020-02-02
vue截圖轉(zhuǎn)base64轉(zhuǎn)文件File異步獲取方式
這篇文章主要介紹了vue截圖轉(zhuǎn)base64轉(zhuǎn)文件File異步獲取方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03
Vue2+Elementui?Dialog實現(xiàn)封裝自定義彈窗組件
在日常的管理系統(tǒng)界面中,我們寫的最多的除了列表表格之外,就是各種彈窗組件,本文就來為大家詳細介紹一下Vue2如何結(jié)合Elementui?Dialog實現(xiàn)封裝自定義彈窗組件,希望對大家有所幫助2023-12-12

