数据源上下文
This commit is contained in:
parent
43b445c10b
commit
889e759656
64
src/core/source.tsx
Normal file
64
src/core/source.tsx
Normal file
@ -0,0 +1,64 @@
|
||||
import { createContext, ProviderProps, useContext } from 'react';
|
||||
|
||||
/**
|
||||
* 上下文中的数据源描述器
|
||||
*/
|
||||
export type SourceContextValue = {
|
||||
/*
|
||||
* 根据上下文返回要修改的字段或输入的源
|
||||
*/
|
||||
getSource: (source: string) => string;
|
||||
|
||||
/*
|
||||
* 根据上下文返回要修改的字段或输入的标签,我们
|
||||
* 可以配合 i18n/i10n 返回一个翻译键。
|
||||
*/
|
||||
getLabel: (source: string) => string;
|
||||
};
|
||||
|
||||
const SourceContext = createContext<SourceContextValue | undefined>(undefined);
|
||||
|
||||
/**
|
||||
* 数据源描述提供器
|
||||
*
|
||||
* 允许一些特殊的输入为它们的子源添加前缀或后缀。
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```jsx
|
||||
* const sourceContext = {
|
||||
* getSource: source => `coordinates.${source}`,
|
||||
* getLabel: source => `resources.posts.fields.${source}`,
|
||||
* }
|
||||
*
|
||||
* const CoordinatesInput = () => {
|
||||
* return (
|
||||
* <SourceContextProvider value={sourceContext}>
|
||||
* <TextInput source="lat" />
|
||||
* <TextInput source="lng" />
|
||||
* </SourceContextProvider>
|
||||
* );
|
||||
* };
|
||||
* ```
|
||||
*/
|
||||
export function SourceContextProvider({ children, value }: ProviderProps<SourceContextValue>) {
|
||||
return (
|
||||
<SourceContext value={value}>
|
||||
{children}
|
||||
</SourceContext>
|
||||
);
|
||||
}
|
||||
|
||||
const defaultContextValue: SourceContextValue = {
|
||||
getSource: (source: string) => source,
|
||||
getLabel: (source: string) => source,
|
||||
};
|
||||
|
||||
export function useSourceContext(): SourceContextValue {
|
||||
const context = useContext(SourceContext);
|
||||
return context ?? defaultContextValue;
|
||||
}
|
||||
|
||||
export function useOptionalSourceContext(): SourceContextValue | undefined {
|
||||
return useContext(SourceContext);
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user