refactor: 重构分页逻辑并统一代码风格
1. 新增分页数据处理hook和工具函数,实现分页状态统一管理 2. 替换所有页面的表格分页配置为标准current/page模式 3. 统一项目内字符串引号风格为双引号 4. 调整权限树面板样式和布局代码格式
This commit is contained in:
20
src/hooks/pageData.ts
Normal file
20
src/hooks/pageData.ts
Normal file
@@ -0,0 +1,20 @@
|
||||
import type { PageData } from '../api/types';
|
||||
|
||||
type PageQuery = {
|
||||
page: number;
|
||||
pageSize: number;
|
||||
};
|
||||
|
||||
export function resolvePageData<T>(
|
||||
response: PageData<T>,
|
||||
query: PageQuery,
|
||||
): PageData<T> {
|
||||
return {
|
||||
list: response.list,
|
||||
pagination: {
|
||||
...response.pagination,
|
||||
page: query.page,
|
||||
pageSize: query.pageSize,
|
||||
},
|
||||
};
|
||||
}
|
||||
@@ -1,31 +1,51 @@
|
||||
import { useEffect, useState } from 'react';
|
||||
import { fetchPage } from '../api/client';
|
||||
import type { PageData } from '../api/types';
|
||||
import { useEffect, useState } from "react";
|
||||
import { fetchPage } from "../api/client";
|
||||
import type { PageData } from "../api/types";
|
||||
import { resolvePageData } from "./pageData";
|
||||
|
||||
type PageQuery = {
|
||||
page: number;
|
||||
pageSize: number;
|
||||
};
|
||||
|
||||
export function usePageData<T>(url: string, enabled = true) {
|
||||
const [loading, setLoading] = useState(false);
|
||||
const [data, setData] = useState<PageData<T>>({
|
||||
list: [],
|
||||
pagination: { page: 1, pageSize: 20, total: 0 },
|
||||
});
|
||||
const [loading, setLoading] = useState(false);
|
||||
const [pageQuery, setPageQuery] = useState<PageQuery>({
|
||||
page: 1,
|
||||
pageSize: 20,
|
||||
});
|
||||
const [data, setData] = useState<PageData<T>>({
|
||||
list: [],
|
||||
pagination: { page: 1, pageSize: 20, total: 0 },
|
||||
});
|
||||
|
||||
const load = async () => {
|
||||
if (!enabled) {
|
||||
return;
|
||||
}
|
||||
setLoading(true);
|
||||
try {
|
||||
setData(await fetchPage<T>(url));
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
};
|
||||
const load = async (query = pageQuery) => {
|
||||
if (!enabled) {
|
||||
return;
|
||||
}
|
||||
setLoading(true);
|
||||
try {
|
||||
const response = await fetchPage<T>(url, query);
|
||||
setData(resolvePageData(response, query));
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
if (enabled) {
|
||||
void load();
|
||||
}
|
||||
}, [url, enabled]);
|
||||
const changePage = (page: number, pageSize: number) => {
|
||||
setPageQuery({ page, pageSize });
|
||||
};
|
||||
|
||||
return { data, loading, reload: load };
|
||||
useEffect(() => {
|
||||
if (enabled) {
|
||||
void load(pageQuery);
|
||||
}
|
||||
}, [url, enabled, pageQuery.page, pageQuery.pageSize]);
|
||||
|
||||
return {
|
||||
data,
|
||||
loading,
|
||||
reload: () => load(pageQuery),
|
||||
changePage,
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user