/** * 岗位列表数据 hook(排序/筛选/搜索/分页均在接口层 fetchJobList 完成) */ import { useCallback, useMemo } from 'react'; import { fetchJobList } from '../api'; import type { Job, JobListParams } from '../types'; import { useAsyncData } from './useAsyncData'; export function useJobList(params?: Partial) { const sortBy = params?.sortBy ?? 'comprehensive'; const keyword = params?.keyword; const industry = params?.industry; const city = params?.city; const salary = params?.salary; const experience = params?.experience; const education = params?.education; const page = params?.page; const pageSize = params?.pageSize; // fetcher 引用需稳定:以基础类型为依赖,避免 useAsyncData 反复触发 const fetcher = useCallback( () => fetchJobList({ sortBy, keyword, industry, city, salary, experience, education, page, pageSize, }), [sortBy, keyword, industry, city, salary, experience, education, page, pageSize], ); const { data, loading, error, refresh } = useAsyncData(fetcher); const jobs = useMemo(() => data?.jobs ?? [], [data]); const total = data?.total ?? 0; // 空状态:加载完成且无错误、但列表为空 const isEmpty = !loading && !error && jobs.length === 0; return { jobs, total, loading, error, refresh, isEmpty }; }