|
| 1 | +# Data Source · [](https://www.npmjs.com/package/@gravity-ui/data-source) [](https://github.com/gravity-ui/data-source/actions/workflows/ci.yml?query=branch:main) |
| 2 | + |
| 3 | +`Data Source` — это простой оберточный компонент для фетчинга данных. В рамках [чистой архитектуры](https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html) он выполняет роль порта, позволяя создавать обертки для различных сценариев работы с данными. `Data Source` в своей основе использует [`react-query`](https://tanstack.com/query/latest). |
| 4 | + |
| 5 | +## Установка |
| 6 | + |
| 7 | +```bash |
| 8 | +npm install @gravity-ui/data-source @tanstack/react-query |
| 9 | +``` |
| 10 | + |
| 11 | +`@tanstack/react-query` является peer-зависимостью. |
| 12 | + |
| 13 | +## Начало работы |
| 14 | + |
| 15 | +В первую очередь определите тип ошибки и на основе стандартных конструкторов создайте свои собственные конструкторы для источников данных и ошибок (`makePlainQueryDataSource` или `makeInfiniteQueryDataSource`). Например: |
| 16 | + |
| 17 | +```ts |
| 18 | +import {makePlainQueryDataSource as makePlainQueryDataSourceBase} from '@gravity-ui/data-source'; |
| 19 | + |
| 20 | +export interface ApiError { |
| 21 | + title: string; |
| 22 | + code?: number; |
| 23 | + description?: string; |
| 24 | +} |
| 25 | + |
| 26 | +export const makePlainQueryDataSource = <TParams, TRequest, TResponse, TData, TError = ApiError>( |
| 27 | + config: Omit<PlainQueryDataSource<TParams, TRequest, TResponse, TData, TError>, 'type'>, |
| 28 | +): PlainQueryDataSource<TParams, TRequest, TResponse, TData, TError> => { |
| 29 | + return makePlainQueryDataSourceBase(config); |
| 30 | +}; |
| 31 | +``` |
| 32 | + |
| 33 | +Создайте компонент `DataLoader` на основе стандартного шаблона. Он поможет настроить отображение статуса загрузки и ошибок. Например: |
| 34 | + |
| 35 | +```tsx |
| 36 | +import { |
| 37 | + DataLoader as DataLoaderBase, |
| 38 | + DataLoaderProps as DataLoaderPropsBase, |
| 39 | + ErrorViewProps, |
| 40 | +} from '@gravity-ui/data-source'; |
| 41 | + |
| 42 | +export interface DataLoaderProps |
| 43 | + extends Omit<DataLoaderPropsBase<ApiError>, 'LoadingView' | 'ErrorView'> { |
| 44 | + LoadingView?: ComponentType; |
| 45 | + ErrorView?: ComponentType<ErrorViewProps<ApiError>>; |
| 46 | +} |
| 47 | + |
| 48 | +export const DataLoader: React.FC<DataLoaderProps> = ({ |
| 49 | + LoadingView = YourLoader, |
| 50 | + ErrorView = YourError, |
| 51 | + ...restProps |
| 52 | +}) => { |
| 53 | + return <DataLoaderBase LoadingView={LoadingView} ErrorView={ErrorView} {...restProps} />; |
| 54 | +}; |
| 55 | +``` |
| 56 | + |
| 57 | +Определите первый источник данных: |
| 58 | + |
| 59 | +```ts |
| 60 | +export const objectDataSource = makePlainQueryDataSource({ |
| 61 | + // Keys have to be unique. Maybe you should create a helper for making names of data sources |
| 62 | + name: 'object', |
| 63 | + // skipContext is just a helper to skip 2 first parameters in the function (context and fetchContext) |
| 64 | + fetch: skipContext(objectFetch), |
| 65 | +}); |
| 66 | +``` |
| 67 | + |
| 68 | +Интегрируйте его в приложение: |
| 69 | + |
| 70 | +```tsx |
| 71 | +import {useQueryData} from '@gravity-ui/data-source'; |
| 72 | + |
| 73 | +export const SomeComponent: React.FC = () => { |
| 74 | + const {data, status, error, refetch} = useQueryData(objectDataSource, {objectId: 1}); |
| 75 | + |
| 76 | + return ( |
| 77 | + <DataLoader status={status} error={error} errorAction={refetch}> |
| 78 | + {data && <ObjectComponent object={data} />} |
| 79 | + </DataLoader> |
| 80 | + ); |
| 81 | +}; |
| 82 | +``` |
0 commit comments