@realsee/five
Version:
Realsee Renderer SDK
145 lines (144 loc) • 5.96 kB
TypeScript
import * as React from "react";
type StoreValueMapType = Record<string, any>;
type StoreActionMapType = {
[name: string]: (...args: any[]) => any;
};
type StoreActionMapHanlder<T extends StoreValueMapType, K extends keyof T, M extends StoreActionMapType> = {
[Key in keyof M]: [
callback: (getValues: () => Pick<T, K>, setValues: (values: Pick<T, K>) => void, ...args: Parameters<M[Key]>) => ReturnType<M[Key]>,
...deps: K[]
];
};
/**
* 监听者模式
* @template T - 预设的监听回调类型
* @example
* ```
* new Store<{
* "foo": [arg1: number, arg2: string],
* "bar": [arg: boolean],
* }>()
* ```
*/
declare class Store<T extends StoreValueMapType> {
/** 值 */
values: T;
/** 全局的数据变化钩子 */
onValuesChange?: (values: T, prevValues: T) => void;
private listeners;
constructor(initialValue: T, onValuesChange?: (values: T, prevValues: T) => void);
/**
* 监听数据变化
* @param names - 监听的字段名称
* @param callback - 回调函数
* @returns 解除监听数据变化
*/
on<K extends keyof T>(names: K[], callback: (values: Pick<T, K>, prevValues: Pick<T, K>) => void): () => void;
/**
* 获取值
* @param names - 值的名称
*/
getValues<K extends keyof T>(names: K[]): Pick<T, K>;
/**
* 设置值
* @param values - 设置值
*/
setValues<K extends keyof T>(names: K[], values: Pick<T, K>): void;
}
declare function createStore<T extends StoreValueMapType, A extends StoreActionMapType = {}>(actionHandler: StoreActionMapHanlder<T, keyof T, A>): {
/**
* 使用 Store
* @param names - 获取的 Store 字段
* @returns [值, 修改值方法]
*/
useStore<K extends keyof T>(names: K[]): [values: Pick<T, K>, setValues: (values: Pick<T, K>) => void];
/**
* 使用 Store (仅设置值)
* @param names - 获取的 Store 字段
* @returns 修改值方法
*/
useStoreSetter<K extends keyof T>(names: K[]): (values: Pick<T, K>) => void;
/**
* 监听 Store 变化
* @param names - Store 字段
* @param callback - 监听变化的回调函数
* @param deps - 依赖对象
*/
watchStore<K extends keyof T>(names: K[], callback: (values: Pick<T, K>, prevValues: Pick<T, K>) => void, deps?: React.DependencyList | undefined): void;
useStoreAction<N extends keyof A, F extends A[N]>(actionName: N): F;
/**
* Store Provider.
* 内部组件均可和 store 交互
*/
StoreProvider: {
new (props: {
initialValue: T;
onValuesChange?: (value: T, prevValue: T) => void;
children: React.ReactNode;
}): {
store: Store<T>;
shouldComponentUpdate(nextProps: {
initialValue: T;
onValuesChange?: (value: T, prevValue: T) => void;
children: React.ReactNode;
}): boolean;
render(): React.FunctionComponentElement<React.ProviderProps<Store<T> | null>>;
context: any;
setState<K extends never>(state: {} | ((prevState: Readonly<{}>, props: Readonly<{
initialValue: T;
onValuesChange?: (value: T, prevValue: T) => void;
children: React.ReactNode;
}>) => {} | Pick<{}, K> | null) | Pick<{}, K> | null, callback?: (() => void) | undefined): void;
forceUpdate(callback?: (() => void) | undefined): void;
readonly props: Readonly<{
initialValue: T;
onValuesChange?: (value: T, prevValue: T) => void;
children: React.ReactNode;
}> & Readonly<{
children?: React.ReactNode | undefined;
}>;
state: Readonly<{}>;
refs: {
[key: string]: React.ReactInstance;
};
componentDidMount?(): void;
componentWillUnmount?(): void;
componentDidCatch?(error: Error, errorInfo: React.ErrorInfo): void;
getSnapshotBeforeUpdate?(prevProps: Readonly<{
initialValue: T;
onValuesChange?: (value: T, prevValue: T) => void;
children: React.ReactNode;
}>, prevState: Readonly<{}>): any;
componentDidUpdate?(prevProps: Readonly<{
initialValue: T;
onValuesChange?: (value: T, prevValue: T) => void;
children: React.ReactNode;
}>, prevState: Readonly<{}>, snapshot?: any): void;
componentWillMount?(): void;
UNSAFE_componentWillMount?(): void;
componentWillReceiveProps?(nextProps: Readonly<{
initialValue: T;
onValuesChange?: (value: T, prevValue: T) => void;
children: React.ReactNode;
}>, nextContext: any): void;
UNSAFE_componentWillReceiveProps?(nextProps: Readonly<{
initialValue: T;
onValuesChange?: (value: T, prevValue: T) => void;
children: React.ReactNode;
}>, nextContext: any): void;
componentWillUpdate?(nextProps: Readonly<{
initialValue: T;
onValuesChange?: (value: T, prevValue: T) => void;
children: React.ReactNode;
}>, nextState: Readonly<{}>, nextContext: any): void;
UNSAFE_componentWillUpdate?(nextProps: Readonly<{
initialValue: T;
onValuesChange?: (value: T, prevValue: T) => void;
children: React.ReactNode;
}>, nextState: Readonly<{}>, nextContext: any): void;
};
contextType?: React.Context<any> | undefined;
};
};
type StoreProviderType = ReturnType<typeof createStore>["StoreProvider"];
export { Store, createStore, StoreProviderType, StoreValueMapType, StoreActionMapType, StoreActionMapHanlder };