#reactjs #typescript #pagination #frontend #react-table
#reactjs #typescript #разбивка на страницы #интерфейс #react-table
Вопрос:
Я пытаюсь реализовать разбивку на страницы с помощью react-table. В большинстве руководств мы начинаем с этого:
const {
getTableProps,
getTableBodyProps,
headerGroups,
page,
prepareRow,
visibleColumns,
canPreviousPage,
canNextPage,
pageOptions,
pageCount,
gotoPage,
nextPage,
previousPage,
setPageSize,
state: { pageIndex, pageSize },
} = useTable(
{
columns,
data,
defaultColumn: { Filter: DefaultColumnFilter },
initialState: { pageIndex: 0, pageSize: 10 },
},
В моем случае моя среда разработки говорит, что свойства:
страница,
canPreviousPage,
canNextPage,
pageOptions,
pageCount,
gotoPage,
следующая
страница, предыдущая страница, setPageSize
не существует для типа ‘TableInstance{}’.
После долгих исследований в www я не могу найти причину, по которой эти свойства отсутствуют в TableInstance. Как я могу использовать разбивку на страницы без этих свойств или есть способ заставить ее работать?
Я с нетерпением жду каждого ответа
Комментарии:
1. Можете ли вы поделиться ссылкой на учебное пособие, которое вы используете?
2. ofc, этот react-table.tanstack.com/docs/examples/pagination
3. Основная проблема заключается в том, что типы TS неверны! Если вы проверите
index.d.ts
file,@types/react-table
вы увидите, например,setPageSize
свойство, объявленное только внутриUsePaginationInstanceProps
иUsePaginationInstanceProps
не используемое нигде.4. Возможно, разработчики этого пакета еще не обновили типы, в то время как сам пакет был перемещен в новую версию.
Ответ №1:
Создание react-table-config.d.ts
файла со следующим содержимым устранило проблему для меня:
import {
UseColumnOrderInstanceProps,
UseColumnOrderState,
UseExpandedHooks,
UseExpandedInstanceProps,
UseExpandedOptions,
UseExpandedRowProps,
UseExpandedState,
UseFiltersColumnOptions,
UseFiltersColumnProps,
UseFiltersInstanceProps,
UseFiltersOptions,
UseFiltersState,
UseGlobalFiltersColumnOptions,
UseGlobalFiltersInstanceProps,
UseGlobalFiltersOptions,
UseGlobalFiltersState,
UseGroupByCellProps,
UseGroupByColumnOptions,
UseGroupByColumnProps,
UseGroupByHooks,
UseGroupByInstanceProps,
UseGroupByOptions,
UseGroupByRowProps,
UseGroupByState,
UsePaginationInstanceProps,
UsePaginationOptions,
UsePaginationState,
UseResizeColumnsColumnOptions,
UseResizeColumnsColumnProps,
UseResizeColumnsOptions,
UseResizeColumnsState,
UseRowSelectHooks,
UseRowSelectInstanceProps,
UseRowSelectOptions,
UseRowSelectRowProps,
UseRowSelectState,
UseRowStateCellProps,
UseRowStateInstanceProps,
UseRowStateOptions,
UseRowStateRowProps,
UseRowStateState,
UseSortByColumnOptions,
UseSortByColumnProps,
UseSortByHooks,
UseSortByInstanceProps,
UseSortByOptions,
UseSortByState
} from 'react-table'
declare module 'react-table' {
// take this file as-is, or comment out the sections that don't apply to your plugin configuration
export interface TableOptions<D extends Record<string, unknown>>
extends UseExpandedOptions<D>,
UseFiltersOptions<D>,
UseGlobalFiltersOptions<D>,
UseGroupByOptions<D>,
UsePaginationOptions<D>,
UseResizeColumnsOptions<D>,
UseRowSelectOptions<D>,
UseRowStateOptions<D>,
UseSortByOptions<D>,
// note that having Record here allows you to add anything to the options, this matches the spirit of the
// underlying js library, but might be cleaner if it's replaced by a more specific type that matches your
// feature set, this is a safe default.
Record<string, any> {}
export interface Hooks<D extends Record<string, unknown> = Record<string, unknown>>
extends UseExpandedHooks<D>,
UseGroupByHooks<D>,
UseRowSelectHooks<D>,
UseSortByHooks<D> {}
export interface TableInstance<D extends Record<string, unknown> = Record<string, unknown>>
extends UseColumnOrderInstanceProps<D>,
UseExpandedInstanceProps<D>,
UseFiltersInstanceProps<D>,
UseGlobalFiltersInstanceProps<D>,
UseGroupByInstanceProps<D>,
UsePaginationInstanceProps<D>,
UseRowSelectInstanceProps<D>,
UseRowStateInstanceProps<D>,
UseSortByInstanceProps<D> {}
export interface TableState<D extends Record<string, unknown> = Record<string, unknown>>
extends UseColumnOrderState<D>,
UseExpandedState<D>,
UseFiltersState<D>,
UseGlobalFiltersState<D>,
UseGroupByState<D>,
UsePaginationState<D>,
UseResizeColumnsState<D>,
UseRowSelectState<D>,
UseRowStateState<D>,
UseSortByState<D> {}
export interface ColumnInterface<D extends Record<string, unknown> = Record<string, unknown>>
extends UseFiltersColumnOptions<D>,
UseGlobalFiltersColumnOptions<D>,
UseGroupByColumnOptions<D>,
UseResizeColumnsColumnOptions<D>,
UseSortByColumnOptions<D> {}
export interface ColumnInstance<D extends Record<string, unknown> = Record<string, unknown>>
extends UseFiltersColumnProps<D>,
UseGroupByColumnProps<D>,
UseResizeColumnsColumnProps<D>,
UseSortByColumnProps<D> {}
export interface Cell<D extends Record<string, unknown> = Record<string, unknown>, V = any>
extends UseGroupByCellProps<D>,
UseRowStateCellProps<D> {}
export interface Row<D extends Record<string, unknown> = Record<string, unknown>>
extends UseExpandedRowProps<D>,
UseGroupByRowProps<D>,
UseRowSelectRowProps<D>,
UseRowStateRowProps<D> {}
}
Как было предложено в:
https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/react-table
Комментарии:
1. Большое вам спасибо
![]()
2. OP и @Muzaffer, я создал файл в разделе @types / react-table, но проблема все еще сохраняется, достаточно ли просто создать этот файл?
3. Куда вы поместили этот файл? Ваш проект или node_modules/@types/react-table?
4. Где должен быть размещен этот файл?
5. Он должен работать везде, где ваш проект может обнаружить файл. В документе предлагается поместить его в корень или в папку types
Ответ №2:
Возможно, это не самый «лучший» ответ. Однако, npm build
если вы хотите запустить, вы не сможете, если не «исправите» ошибку отсутствующего типа. То, что я сделал, просто помещается @ts-ignore
над подчеркнутыми фрагментами кода. Это выглядит примерно так:
// @ts-ignore
nextPage