infogo-tree
Version:
A vue tree component using virtual list.
232 lines (231 loc) • 9.54 kB
TypeScript
import TreeNode, { ITreeNodeOptions } from './tree-node';
import { TreeNodeKeyType, IgnoreType } from '../const';
interface ITreeStoreOptions {
[key: string]: any;
keyField: string;
ignoreMode?: IgnoreType;
filteredNodeCheckable?: boolean;
cascade?: boolean;
cascadeLoose?: boolean;
defaultExpandAll?: boolean;
load?: Function;
expandOnFilter?: boolean;
}
interface IMapData {
[key: string]: TreeNode;
[key: number]: TreeNode;
}
export interface IEventNames {
'set-data': () => void;
'visible-data-change': () => void;
'render-data-change': () => void;
'expand': NodeGeneralListenerType;
'select': NodeGeneralListenerType;
'unselect': NodeGeneralListenerType;
'selected-change': (node: TreeNode | null, key: TreeNodeKeyType | null) => void;
'check': NodeGeneralListenerType;
'uncheck': NodeGeneralListenerType;
'checked-change': (nodes: TreeNode[], keys: TreeNodeKeyType[]) => void;
}
declare type NodeGeneralListenerType = (node: TreeNode) => void;
export declare type ListenerType<T extends keyof IEventNames> = IEventNames[T];
export declare type FilterFunctionType = (keyword: string, node: TreeNode) => boolean;
export default class TreeStore {
private readonly options;
/** 树数据 */
data: TreeNode[];
childStr: string;
/** 扁平化的树数据 */
flatData: TreeNode[];
disabledFn: any;
/** 树数据 map */
mapData: IMapData;
/** 未加载但已选中的节点 key ,每次 flattenData 的时候进行检查,将加载的节点从此数组中剔除 */
private unloadCheckedKeys;
/** 未加载但选中的单选节点 key */
private unloadSelectedKey;
/** 当前单选选中节点 key */
private currentSelectedKey;
/** 事件 listeners */
private listenersMap;
constructor(options: ITreeStoreOptions);
setData(data: ITreeNodeOptions[], selectableUnloadKey: string | number | null | undefined, checkableUnloadKeys: TreeNodeKeyType[] | null | undefined, childStr: string, disabledFn: any, replenishSelect: Boolean): void;
/**
* 设置单个节点多选选中
* @param key 设置的节点 key
* @param value 是否选中
* @param triggerEvent 是否触发事件
* @param triggerDataChange 是否触发 `data-change` 事件以通知外部刷新视图
* @param filtering 是否正在过滤,如果是,则考虑 `filteredNodeCheckable` Prop,用于判断是否是用户点击节点触发的勾选
* @param isCheckAll 是否是全选
*/
setChecked(key: TreeNodeKeyType, value: boolean, triggerEvent?: boolean, triggerDataChange?: boolean, filtering?: boolean, isCheckAll?: boolean): void;
/**
* 设置单个未加载节点选中,不公开此 API
*/
private setUnloadChecked;
/**
* 批量选中/取消多选选中节点
* @param keys 选中的节点 key 数组
* @param value 是否选中
* @param triggerEvent 是否触发事件
*/
setCheckedKeys(keys: TreeNodeKeyType[], value: boolean, triggerEvent?: boolean, triggerDataChange?: boolean, isCheckAll?: boolean): void;
/**
* 多选勾选全部节点
* @param triggerEvent 是否触发事件
* @param triggerDataChange 是否触发视图刷新
*/
checkAll(triggerEvent?: boolean, triggerDataChange?: boolean): void;
/**
* 清除所有多选已选
* @param triggerEvent 是否触发事件
* @param triggerDataChange 是否触发视图刷新
*/
clearChecked(triggerEvent?: boolean, triggerDataChange?: boolean): void;
/**
* 触发 checked-change 的快捷方法
* @param triggerEvent 是否触发事件
* @param triggerDataChange 是否触发视图刷新
*/
private triggerCheckedChange;
/**
* 设置单选选中
* @param key 选中节点 key
* @param value 是否选中
* @param triggerEvent 是否触发事件
*/
setSelected(key: TreeNodeKeyType, value: boolean, triggerEvent?: boolean, triggerDataChange?: boolean): void;
/**
* 设置未加载单选选中节点,不公开此 API
*/
private setUnloadSelected;
/**
* 清除当前单选选中
* @param triggerEvent 是否触发事件
* @param triggerDataChange 是否触发视图刷新
*/
clearSelected(triggerEvent?: boolean, triggerDataChange?: boolean): void;
/**
* 设置节点展开
* @param key 节点 key
* @param value 是否展开
* @param expandParent 展开节点时是否同时展开父节点
* @param triggerEvent 是否触发事件
* @param triggerDataChange 是否触发 `data-change` 事件以通知外部刷新视图
*/
setExpand(key: TreeNodeKeyType, value: boolean, expandParent?: boolean, triggerEvent?: boolean, triggerDataChange?: boolean): void;
/**
* 批量设置节点展开/折叠
* @param keys 展开的节点 key 数组
* @param value 是否展开
*/
setExpandKeys(keys: TreeNodeKeyType[], value: boolean, triggerDataChange?: boolean): void;
setExpandAll(value: boolean, triggerDataChange?: boolean): void;
/**
* 获取多选选中节点
* @param ignoreMode 忽略模式,可选择忽略父节点或子节点,默认值是 CTree 的 ignoreMode Prop
*/
getCheckedNodes(ignoreMode?: "children" | "none" | "parents" | undefined): TreeNode[];
/**
* 获取多选选中的节点 key ,包括未加载的 key
* @param ignoreMode 忽略模式,同 `getCheckedNodes`
*/
getCheckedKeys(ignoreMode?: "children" | "none" | "parents" | undefined): TreeNodeKeyType[];
/**
* 获取多选半选状态节点
*/
getIndeterminateNodes(): TreeNode[];
/**
* 获取当前单选选中节点
*/
getSelectedNode(): TreeNode | null;
/**
* 获取当前单选选中节点 key ,有可能是未加载的选中项
*/
getSelectedKey(): TreeNodeKeyType | null;
/**
* 获取未加载但多选选中的节点
*/
getUnloadCheckedKeys(): TreeNodeKeyType[];
/**
* 获取展开节点
*/
getExpandNodes(): TreeNode[];
/**
* 获取展开节点 keys
*/
getExpandKeys(): TreeNodeKeyType[];
/**
* 根据节点 key 获取节点
* @param key 节点 key
*/
getNode(key: TreeNodeKeyType): TreeNode | null;
insertBefore(insertedNode: TreeNodeKeyType | ITreeNodeOptions, referenceKey: TreeNodeKeyType): TreeNode | null;
insertAfter(insertedNode: TreeNodeKeyType | ITreeNodeOptions, referenceKey: TreeNodeKeyType): TreeNode | null;
append(insertedNode: TreeNodeKeyType | ITreeNodeOptions, parentKey: TreeNodeKeyType): TreeNode | null;
prepend(insertedNode: TreeNodeKeyType | ITreeNodeOptions, parentKey: TreeNodeKeyType): TreeNode | null;
/**
* 删除节点
* @param removedKey 要删除的节点 key
*/
remove(removedKey: TreeNodeKeyType, triggerDataChange?: boolean): TreeNode | null;
private getInsertedNode;
/**
* 将一个节点插入 store 记录中
* @param node 要插入的节点
* @param parentNode 要插入节点的父节点
* @param childIndex 如果有父节点,则需提供要插入的节点在同级节点中的顺序
* @param flatIndex 在 flatData 中的索引
* @param dataIndex 如果没有父节点,需要提供节点在 data 中的索引
*/
private insertIntoStore;
private updateMovingNodeStatus;
/**
* 过滤本地节点数据
* @param keyword 过滤关键词
* @param filterMethod 过滤方法
*/
filter(keyword: string, filterMethod: FilterFunctionType): void;
/**
* 过滤未加载多选节点,对比最终勾选节点是否有变化并触发 checked-change 事件
* @param keys 全量选中节点 key 数组,包括加载与未加载选中节点
*/
private setUnloadCheckedKeys;
/**
* 过滤未加载单选选中节点,对比是否有变化并触发 selected-change 事件
* @param key 节点 key
*/
private setUnloadSelectedKey;
/**
* 保存扁平化的节点数据 `flatData` 与节点数据 Map `mapData`
* @param nodes 树状节点数据
* @param overrideSelected 是否根据数据设置 `selected`
*/
private flattenData;
/**
* 向下勾选/取消勾选节点,包括自身
* @param node 需要向下勾选的节点
* @param value 勾选或取消勾选
* @param filtering 是否正在过滤,如果是,则考虑 `filteredNodeCheckable` Prop
*/
private checkNodeDownward;
/**
* 向上勾选/取消勾选父节点,不包括自身
* @param node 需要勾选的节点
*/
private checkNodeUpward;
/**
* 根据子节点的勾选状态更新当前父节点的勾选状态
* @param node 需要勾选的节点
*/
private checkParentNode;
/**
* 搜索节点在指定数组中的位置
*/
private findIndex;
on<T extends keyof IEventNames>(eventName: T, listener: ListenerType<T> | Array<ListenerType<T>>): void;
off<T extends keyof IEventNames>(eventName: T, listener?: ListenerType<T>): void;
emit<T extends keyof IEventNames>(eventName: T, ...args: Parameters<IEventNames[T]>): void;
}
export {};