<DataProvider />
管理状态,提供使用各个 hook 所需的全部 context。它应尽可能放在应用树的高处,因为只有在 React 树中位于该 provider 之下的组件才能使用这些 hook。
- Web
- React Native
- NextJS
- Expo
- Anansi
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>,
);
index.tsx
import { DataProvider } from '@data-client/react';
import { AppRegistry } from 'react-native';
import App from './App';
const Root = () => (
<DataProvider>
<App />
</DataProvider>
);
AppRegistry.registerComponent('MyApp', () => Root);
app/layout.tsx
import { DataProvider } from '@data-client/react/nextjs';
export default function RootLayout({ children }) {
return (
<html>
<body>
<DataProvider>{children}</DataProvider>
</body>
</html>
);
}
app/_layout.tsx
import { Stack } from 'expo-router';
import { DataProvider } from '@data-client/react';
export default function RootLayout() {
return (
<DataProvider>
<Stack>
<Stack.Screen name="index" />
</Stack>
</DataProvider>
);
}
Anansi(beta)是一个完全可组合的 React 开发框架,可选支持服务端渲染。
bash
npx @anansi/cli hatch my-project
Anansi 已自动集成 Reactive Data Client。
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>