跳到主要内容

<DataProvider />

管理状态,提供使用各个 hook 所需的全部 context。它应尽可能放在应用树的高处,因为只有在 React 树中位于该 provider 之下的组件才能使用这些 hook。

index.tsx
import { DataProvider } from '@data-client/react';
import { createRoot } from 'react-dom/client';
import App from './App';

createRoot(document.body).render(
<DataProvider>
<App />
</DataProvider>,
);

或者,将状态与 redux 集成

Props​

interface ProviderProps {
children: ReactNode;
managers?: Manager[];
initialState?: State<unknown>;
Controller?: new (props: { gcPolicy: GCInterface }) => Controller;
gcPolicy?: GCInterface;
devButton?:
| 'bottom-right'
| 'bottom-left'
| 'top-right'
| 'top-left'
| null;
}

initialState: State<unknown>​

export interface State<T> {
readonly entities: {
readonly [entityKey: string]: { readonly [pk: string]: T } | undefined;
};
readonly endpoints: {
readonly [key: string]: unknown | PK[] | PK | undefined;
};
readonly indexes: NormalizedIndex;
readonly meta: {
readonly [key: string]: {
readonly date: number;
readonly fetchedAt: number;
readonly expiresAt: number;
readonly prevExpiresAt?: number;
readonly error?: ErrorTypes;
readonly invalidated?: boolean;
readonly errorPolicy?: 'hard' | 'soft' | undefined;
};
};
readonly entitiesMeta: {
readonly [entityKey: string]: {
readonly [pk: string]: {
readonly date: number;
readonly expiresAt: number;
readonly fetchedAt: number;
};
};
};
readonly optimistic: (SetResponseAction | OptimisticAction)[];
readonly lastReset: number;
}

你可以提供自己的初始状态,而不是从空缓存开始。这在测试时,或在服务端渲染中恢复(rehydrate)缓存状态时很有用。

managers?: Manager[]​

要使用的 Manager 列表。这是 provider 最主要的扩展点。

可以使用 getDefaultManagers() 来扩展默认的 Manager。

生产环境默认值:

[new NetworkManager(), new SubscriptionManager(PollingSubscription)];

开发环境默认值:

[
new DevToolsManager(),
new NetworkManager(),
new SubscriptionManager(PollingSubscription),
];

Controller?: Controller 类​

这让你可以扩展 Controller 来提供更多功能。如果你有额外的 action 想要分发给自定义的 Manager,这会很有用

import { DataProvider, Controller } from '@data-client/react';
import App from './App';

class MyController extends Controller {
doSomething = () => {
console.log('hi');
};
}

const RealApp = (
<DataProvider Controller={MyController}>
<App />
</DataProvider>
);

gcPolicy?: GCInterface​

当数据不再被任何组件使用且已过时,就将其从 store 中移除。默认为 new GCPolicy()。

import { DataProvider, GCPolicy } from '@data-client/react';
import App from './App';

const gcPolicy = new GCPolicy({ intervalMS: 60 * 1000 * 10 });

const RealApp = (
<DataProvider gcPolicy={gcPolicy}>
<App />
</DataProvider>
);
GCPolicy options
new GCPolicy({
// how often to sweep (default 5 minutes)
intervalMS: 60 * 1000 * 5,
// how many stale lifetimes before data is removed (default 2)
expiryMultiplier: 2,
// or choose when unused data is removed (replaces expiryMultiplier)
// here: one minute after it goes stale
expiresAt: ({ expiresAt }) => expiresAt + 60 * 1000,
});

devButton​

在开发环境中会出现一个小按钮,如果已安装浏览器 DevTools,可以通过它快速打开。此选项用于配置按钮显示的位置,设为 null 则完全禁用它。

'bottom-right' | 'bottom-left' | 'top-right'| 'top-left' | null = 'bottom-right'

Disable button
import { DataProvider } from '@data-client/react';
import App from './App';

<DataProvider devButton={null}>
<App/>
</DataProvider>
Place in top right corner
import { DataProvider } from '@data-client/react';
import App from './App';

<DataProvider devButton="top-right">
<App/>
</DataProvider>