ivue-material-plus
Version:
A high quality UI components Library with Vue.js
49 lines (39 loc) • 1.11 kB
text/typescript
import { inject, provide, InjectionKey } from 'vue';
// type
import type Node from '../store/node';
interface NodeMap {
treeNodeCollapse(node: Node): void;
children: NodeMap[];
}
const TreeNodeMapContextKey: InjectionKey<NodeMap> =
Symbol('ivue-tree-node-map');
// 派发展开事件
export function useNodeExpandEventBroadcast(props) {
const parentNodeMap = inject(TreeNodeMapContextKey, null);
// 当前节点
const currentNodeMap: NodeMap = {
// tree 节点关闭
treeNodeCollapse: (node) => {
if (props.node !== node) {
props.node.collapse();
}
},
children: [],
};
// 有父节点
if (parentNodeMap) {
parentNodeMap.children.push(currentNodeMap);
}
provide(TreeNodeMapContextKey, currentNodeMap);
return {
broadcastExpanded: (node: Node): void => {
// 是否每次只打开一个同级树节点展开
if (!props.accordion) {
return;
}
for (const childNode of currentNodeMap.children) {
childNode.treeNodeCollapse(node);
}
},
};
}