公共Hooks封裝useTableData表格數(shù)據(jù)實(shí)例
寫在前面
對于經(jīng)常需要開發(fā)企業(yè)管理后臺的前端開發(fā)來說,必不可少的需要使用表格對于數(shù)據(jù)進(jìn)行操作,在對于現(xiàn)有項(xiàng)目進(jìn)行代碼優(yōu)化時,封裝一些公共的Hooks.
本篇文章為useTableData.js
基于個人項(xiàng)目環(huán)境進(jìn)行封裝的Hooks,僅以本文介紹封裝Hooks思想心得,故相關(guān)代碼可能不適用他人
項(xiàng)目環(huán)境
Vue3.x + Ant Design Vue3.x + Vite3.x
封裝分解:聲明變量
import { ref, shallowRef, isRef } from 'vue'; const loading = ref(false); // 表格數(shù)據(jù)UI交互Loading const tableData = shallowRef([]); // 表格數(shù)據(jù)ShallowRef全響應(yīng)式 const totalElements = ref(0); // 總數(shù)據(jù)量totalElements
無論是使用過Ant Design Vue 還是Element UI 亦或是其他UI FrameWork 框架,表格里需要的必定有tableData、totalElements。
封裝分解:請求接口
以下代碼僅解釋封裝思想
const getTableData = async() => { *** const { data || data: { content, totalElements: total } } = await API(QueryParams) // 請求接口, *** tableData.value = data || data.content || data.content.map(item => {***}) //解構(gòu)data進(jìn)行賦值 totalElements.value = total }
接口請求表格數(shù)據(jù),最基礎(chǔ)的"增刪改查"之一,針對后端提供接口和相關(guān)代碼產(chǎn)出規(guī)范約定俗成后,封裝Hooks同時考慮,tableData是否能夠直接由data解構(gòu)的content賦值,或需要進(jìn)行二次處理
封裝分解:篩選查詢 及重置查詢
const search = async () => { queryParams.value.pageIndex = 1; // 根據(jù)篩選想查詢數(shù)據(jù),重置頁碼為1,調(diào)用接口 await getTableData(); }; const resetSearch = async () => { if (isFunction(options.resetParams)) { options.resetParams(); // 重置請求參數(shù) await getTableData(); } };
封裝分解:獲取分頁器配置
以下封裝基于項(xiàng)目環(huán)境Ant Design Vue 3.x
const getPaginationOptions = () => { return { total: totalElements.value, current: queryParams.value.pageIndex, pageSize: queryParams.value.pageSize, showQuickJumper: true, showSizeChanger: true, showTotal: _total => `共 ${_total} 條數(shù)據(jù)`, }; };
封裝分解:表格change事件(分頁、排序、篩選變化觸發(fā))
以下封裝基于項(xiàng)目環(huán)境Ant Design Vue 3.x
const onTableChange = async (page, _, sorter) => { // page: 頁碼, sorter: 排序字段 queryParams.value.pageIndex = page.current || 1; queryParams.value.pageSize = page.pageSize || 10; if (sorter && Object.keys(sorter).length > 0) { if (sorter.order) { queryParams.value.orderBy = sorter.field; // asc \ desc queryParams.value.direction = sorter.order.slice(0, -3); } else { queryParams.value.orderBy = ''; queryParams.value.direction = ''; } } await getTableData(); };
useTableData.js完整代碼
import { ref, shallowRef, isRef } from 'vue'; import { isFunction } from 'lodash-es'; export function useTableData(apiInterface, queryParams, options = {}) { if (!isRef(queryParams)) throw new Error('queryParams 參數(shù)必修為 Ref 類型'); const loading = ref(false); const tableData = shallowRef([]); const totalElements = ref(0); const getTableData = async () => { try { loading.value = true; const { data: { content, totalElements: total }, } = await apiInterface(queryParams.value); if (isFunction(options.handleContent)) { tableData.value = content.map(options.handleContent); } else { tableData.value = content; } if (isFunction(options.callback)) { options.callback(content); } totalElements.value = total; } finally { loading.value = false; } }; const onTableChange = async (page, _, sorter) => { queryParams.value.pageIndex = page.current || 1; queryParams.value.pageSize = page.pageSize || 10; if (sorter && Object.keys(sorter).length > 0) { if (sorter.order) { queryParams.value.orderBy = sorter.field; queryParams.value.direction = sorter.order.slice(0, -3); } else { queryParams.value.orderBy = ''; queryParams.value.direction = ''; } } await getTableData(); }; const search = async () => { queryParams.value.pageIndex = 1; await getTableData(); }; const resetSearch = async () => { if (isFunction(options.resetParams)) { options.resetParams(); await getTableData(); } }; const getPaginationOptions = () => { return { total: totalElements.value, current: queryParams.value.pageIndex, pageSize: queryParams.value.pageSize, showQuickJumper: true, showSizeChanger: true, showTotal: _total => `共 ${_total} 條數(shù)據(jù)`, }; }; return { loading, totalElements, tableData, search, resetSearch, getPaginationOptions, getTableData, onTableChange, }; }
實(shí)際使用示例
// 頁面Page.vue import { useQueryParams, useTableData } from '@/hooks'; import { dataList } from '@/services' const { tableData, loading, getTableData, getPaginationOptions, onTableChange, search } = useTableData( dataList, queryParams, );
如此頁面只需要引入Hooks,和接口地址,即可完成單頁面數(shù)據(jù)表格的查詢功能~ 算是個人理解意義下的“低代碼”~
以上就是公共Hooks封裝useTableData表格數(shù)據(jù)實(shí)例的詳細(xì)內(nèi)容,更多關(guān)于公共Hooks封裝useTableData的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
vite+vue3不清除瀏覽器緩存直接下載最新代碼的解決方案
vite+vue3項(xiàng)目發(fā)布后,瀏覽器上還是舊代碼,沒有及時更新到最新代碼,下面通過本文給大家分享vite+vue3不清除瀏覽器緩存直接下載最新代碼的解決方案,感興趣的朋友一起看看吧2024-06-06vue中跳轉(zhuǎn)界面的3種實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于vue中跳轉(zhuǎn)界面的3種實(shí)現(xiàn)方法,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07如何用命令窗口的方式創(chuàng)建Vue項(xiàng)目
這篇文章主要介紹了如何用命令窗口的方式創(chuàng)建Vue項(xiàng)目過程,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08Vue數(shù)據(jù)與事件綁定以及Class和Style的綁定詳細(xì)講解
這篇文章主要介紹了Vue數(shù)據(jù)與事件綁定以及Class和Style的綁定,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-01-01關(guān)于el-form表單驗(yàn)證中的validator與validate使用時的問題
這篇文章主要介紹了關(guān)于el-form表單驗(yàn)證中的validator與validate使用時的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06