@alifd/next
Version:
A configurable component library for web built on React.
155 lines (154 loc) • 5.71 kB
TypeScript
import React, { type ReactElement, type MouseEvent, type ReactNode } from 'react';
import PropTypes from 'prop-types';
import Menu from '../menu';
import Input from '../input';
import DataStore from './data-store';
import { getValueDataSource } from './util';
import type { BaseProps, DataSourceItem, NormalizedObjectItem, ObjectItem, VisibleChangeType } from './types';
export interface BaseState {
dataStore: DataStore;
value?: DataSourceItem | DataSourceItem[];
searchValue?: string;
visible?: boolean;
dataSource: NormalizedObjectItem[];
width: number;
highlightKey?: string | null;
srReader?: ReactNode;
}
export default class Base<P extends BaseProps = BaseProps, S extends BaseState = BaseState> extends React.Component<P, S> {
static propTypes: {
prefix: PropTypes.Requireable<string>;
size: PropTypes.Requireable<string>;
value: PropTypes.Requireable<any>;
defaultValue: PropTypes.Requireable<any>;
placeholder: PropTypes.Requireable<string>;
autoWidth: PropTypes.Requireable<boolean>;
label: PropTypes.Requireable<PropTypes.ReactNodeLike>;
hasClear: PropTypes.Requireable<boolean>;
state: PropTypes.Requireable<string>;
readOnly: PropTypes.Requireable<boolean>;
disabled: PropTypes.Requireable<boolean>;
visible: PropTypes.Requireable<boolean>;
defaultVisible: PropTypes.Requireable<boolean>;
onVisibleChange: PropTypes.Requireable<(...args: any[]) => any>;
popupContainer: PropTypes.Requireable<any>;
popupClassName: PropTypes.Requireable<any>;
popupStyle: PropTypes.Requireable<object>;
popupProps: PropTypes.Requireable<object>;
followTrigger: PropTypes.Requireable<boolean>;
popupContent: PropTypes.Requireable<PropTypes.ReactNodeLike>;
menuProps: PropTypes.Requireable<object>;
filterLocal: PropTypes.Requireable<boolean>;
filter: PropTypes.Requireable<(...args: any[]) => any>;
defaultHighlightKey: PropTypes.Requireable<string>;
highlightKey: PropTypes.Requireable<string>;
onToggleHighlightItem: PropTypes.Requireable<(...args: any[]) => any>;
autoHighlightFirstItem: PropTypes.Requireable<boolean>;
useVirtual: PropTypes.Requireable<boolean>;
className: PropTypes.Requireable<any>;
children: PropTypes.Requireable<any>;
dataSource: PropTypes.Requireable<any[]>;
itemRender: PropTypes.Requireable<(...args: any[]) => any>;
mode: PropTypes.Requireable<string>;
notFoundContent: PropTypes.Requireable<PropTypes.ReactNodeLike>;
locale: PropTypes.Requireable<object>;
rtl: PropTypes.Requireable<boolean>;
popupComponent: PropTypes.Requireable<any>;
isPreview: PropTypes.Requireable<boolean>;
renderPreview: PropTypes.Requireable<(...args: any[]) => any>;
showDataSourceChildren: PropTypes.Requireable<boolean>;
};
static defaultProps: BaseProps;
dataStore: DataStore;
selectDOM: HTMLElement;
width: string | number;
popupRef: HTMLDivElement;
resizeTimeout: number;
highlightTimer: number | undefined;
menuRef: InstanceType<typeof Menu> | null;
isAutoComplete: boolean;
inputRef: ReturnType<InstanceType<typeof Input>['getInstance']>;
valueDataSource: ReturnType<typeof getValueDataSource>;
constructor(props: P);
componentDidMount(): void;
componentDidUpdate(prevProps: P, prevState: S): void;
componentWillUnmount(): void;
/**
* Calculate and set width of popup menu
*/
syncWidth(): void;
handleResize(): void;
/**
* Get structured dataSource, for cache
*/
setDataSource(props: P): NormalizedObjectItem[];
/**
* Set popup visible
*/
setVisible(visible: boolean, type?: VisibleChangeType): void;
setFirstHightLightKeyForMenu(searchValue?: unknown): void;
handleChange(value: BaseProps['value'], ...args: [unknown, (ObjectItem | ObjectItem[])?]): void;
/**
* Handle Menu body click
* @param e - click event
*/
handleMenuBodyClick(): void;
/**
* Toggle highlight MenuItem
* @param dir - -1: up, 1: down
*/
toggleHighlightItem(dir: number): false | NormalizedObjectItem | undefined;
scrollMenuIntoView(): void;
/**
* render popup menu header
*/
renderMenuHeader(): React.ReactNode;
handleSelect(): void;
/**
* 防止 onBlur/onFocus 抖动
*/
handleMouseDown: (e: MouseEvent<HTMLElement>) => void;
/**
* abstract
*/
handleMenuSelect(...rest: unknown[]): void;
/**
* abstract
*/
handleItemClick(...rest: unknown[]): void;
/**
* abstract
*/
useDetailValue(): boolean;
/**
* abstract
*/
handleVisibleChange(...rest: unknown[]): void;
/**
* abstract
*/
renderSelect(): React.JSX.Element;
/**
* render popup children
* @param props -
*/
renderMenu(): React.JSX.Element;
/**
* render menu item
*/
renderMenuItem(dataSource: NormalizedObjectItem[]): ReactElement[];
saveSelectRef: (ref: HTMLElement | null) => void;
saveInputRef: (ref: InstanceType<typeof Input>) => void;
/**
* 点击 arrow 或 label 的时候焦点切到 input 中
* @override
*/
focusInput(): void;
focus(start?: number, end?: number, preventScroll?: boolean): void;
beforeOpen(): void;
beforeClose(): void;
afterClose(): void;
savePopupRef: (ref: HTMLDivElement) => void;
shouldAutoWidth(): false | P["autoWidth"] | undefined;
render(props?: P): React.JSX.Element;
}