【发布时间】:2020-08-31 16:01:13
【问题描述】:
我在为我的自定义钩子 usePagination 创建接口时遇到问题。我需要帮助来将此钩子创建为通用的,因为此时用户接口与其余接口无关。 dataEntries 是具有 id、firstName 和 lastName 的用户数组。 ElementsOnPage 默认设置为 50。
function usePagination(dataEntries,elementsOnPage = 50) {
const [actualPageIdx, setActualPageIdx] = useState(1)
const lastPageIdx = Math.ceil(dataEntries.length / elementsOnPage)
const [isBusy, setIsBusy] = useState(false)
const timeoutRef = useRef<any>(null)
useEffect(() => {
setIsBusy(true)
if (timeoutRef.current) {
clearTimeout(timeoutRef.current)
}
timeoutRef.current = setTimeout(() => {
setIsBusy(false)
}, 333)
}, [actualPageIdx])
const entriesOnSelectedPage = () => {
const firstEntry = (actualPageIdx - 1) * elementsOnPage
const lastEntry = firstEntry + elementsOnPage
console.log(dataEntries.slice(firstEntry, lastEntry))
return dataEntries.slice(firstEntry, lastEntry)
}
const goToFirstPage = useCallback(() => {
setActualPageIdx(1)
}, [])
const goToLastPage = () => {
setActualPageIdx(lastPageIdx)
}
const goToPage = (page: number) => {
setActualPageIdx(page)
}
const goToPrevPage = () => {
setActualPageIdx((actualPageIdx) => (actualPageIdx === 1 ? actualPageIdx : actualPageIdx - 1))
}
const goToNextPage = () => {
setActualPageIdx((actualPageIdx) =>
actualPageIdx === lastPageIdx ? actualPageIdx : actualPageIdx + 1
)
}
return [
{ actualPageIdx,
lastPageIdx,
entriesOnSelectedPage,
isBusy },
{
goToFirstPage,
goToPrevPage,
goToPage,
goToNextPage,
goToLastPage,
},
]
}
我尝试过这样做:
interface User {
id: number
firstName: string
lastName: string
}
interface PaginationState {
lastPageIdx: number
actualPageIdx: number
entriesOnSelectedPage: () => User[]
isBusy: boolean
}
interface PaginationActions {
goToFirstPage: () => void
goToPrevPage: () => void
goToNextPage: () => void
goToLastPage: () => void
goToPage: (number: number) => void
}
但我想使用泛型类型来检索这样的东西:
function usePagination<T>(dataEntries: T[], elementsOnPage = 50): [PaginationState, PaginationActions] {
return [
{ actualPageIdx,
lastPageIdx,
entriesOnSelectedPage,
isBusy },
{
goToFirstPage,
goToPrevPage,
goToPage,
goToNextPage,
goToLastPage,
},
]
}
【问题讨论】:
标签: reactjs typescript react-hooks