refactor: tree
parent
9cbaeabbd6
commit
5f189f534e
|
@ -1,4 +1,4 @@
|
||||||
import type { VNode, PropType, DefineComponent, ExtractPropTypes, CSSProperties } from 'vue';
|
import type { PropType, ExtractPropTypes } from 'vue';
|
||||||
import { ref } from 'vue';
|
import { ref } from 'vue';
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent } from 'vue';
|
||||||
import classNames from '../_util/classNames';
|
import classNames from '../_util/classNames';
|
||||||
|
@ -7,7 +7,7 @@ import animation from '../_util/openAnimation';
|
||||||
import PropTypes from '../_util/vue-types';
|
import PropTypes from '../_util/vue-types';
|
||||||
import { filterEmpty } from '../_util/props-util';
|
import { filterEmpty } from '../_util/props-util';
|
||||||
import initDefaultProps from '../_util/props-util/initDefaultProps';
|
import initDefaultProps from '../_util/props-util/initDefaultProps';
|
||||||
import type { DataNode, FieldNames, Key } from '../vc-tree/interface';
|
import type { DataNode, DragNodeEvent, FieldNames, Key } from '../vc-tree/interface';
|
||||||
import { treeProps as vcTreeProps } from '../vc-tree/props';
|
import { treeProps as vcTreeProps } from '../vc-tree/props';
|
||||||
import useConfigInject from '../_util/hooks/useConfigInject';
|
import useConfigInject from '../_util/hooks/useConfigInject';
|
||||||
import renderSwitcherIcon from './utils/iconUtil';
|
import renderSwitcherIcon from './utils/iconUtil';
|
||||||
|
@ -33,36 +33,20 @@ export interface AntdTreeNodeAttribute {
|
||||||
disableCheckbox: boolean;
|
disableCheckbox: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface AntTreeNodeProps {
|
export type AntTreeNodeProps = DataNode;
|
||||||
className?: string;
|
|
||||||
checkable?: boolean;
|
|
||||||
disabled?: boolean;
|
|
||||||
disableCheckbox?: boolean;
|
|
||||||
title?: string | any;
|
|
||||||
key?: Key;
|
|
||||||
eventKey?: string;
|
|
||||||
isLeaf?: boolean;
|
|
||||||
checked?: boolean;
|
|
||||||
expanded?: boolean;
|
|
||||||
loading?: boolean;
|
|
||||||
selected?: boolean;
|
|
||||||
selectable?: boolean;
|
|
||||||
icon?: ((treeNode: AntdTreeNodeAttribute) => any) | VNode;
|
|
||||||
children?: any;
|
|
||||||
[customProp: string]: any;
|
|
||||||
}
|
|
||||||
|
|
||||||
export type AntTreeNode = DefineComponent<AntTreeNodeProps, {}>;
|
// [Legacy] Compatible for v2
|
||||||
|
export type TreeDataItem = DataNode;
|
||||||
|
|
||||||
export interface AntTreeNodeBaseEvent {
|
export interface AntTreeNodeBaseEvent {
|
||||||
node: AntTreeNode;
|
node: DataNode;
|
||||||
nativeEvent: MouseEvent;
|
nativeEvent: MouseEvent;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface AntTreeNodeCheckedEvent extends AntTreeNodeBaseEvent {
|
export interface AntTreeNodeCheckedEvent extends AntTreeNodeBaseEvent {
|
||||||
event: 'check';
|
event: 'check';
|
||||||
checked?: boolean;
|
checked?: boolean;
|
||||||
checkedNodes?: AntTreeNode[];
|
checkedNodes?: DataNode[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface AntTreeNodeSelectedEvent extends AntTreeNodeBaseEvent {
|
export interface AntTreeNodeSelectedEvent extends AntTreeNodeBaseEvent {
|
||||||
|
@ -76,7 +60,7 @@ export interface AntTreeNodeExpandedEvent extends AntTreeNodeBaseEvent {
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface AntTreeNodeMouseEvent {
|
export interface AntTreeNodeMouseEvent {
|
||||||
node: AntTreeNode;
|
node: DataNode;
|
||||||
event: DragEvent;
|
event: DragEvent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,17 +69,14 @@ export interface AntTreeNodeDragEnterEvent extends AntTreeNodeMouseEvent {
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface AntTreeNodeDropEvent {
|
export interface AntTreeNodeDropEvent {
|
||||||
node: AntTreeNode;
|
node: DragNodeEvent;
|
||||||
dragNode: AntTreeNode;
|
dragNode: DragNodeEvent;
|
||||||
dragNodesKeys: Key[];
|
dragNodesKeys: Key[];
|
||||||
dropPosition: number;
|
dropPosition: number;
|
||||||
dropToGap?: boolean;
|
dropToGap?: boolean;
|
||||||
event: MouseEvent;
|
event: MouseEvent;
|
||||||
}
|
}
|
||||||
|
|
||||||
// [Legacy] Compatible for v2
|
|
||||||
export type TreeDataItem = DataNode;
|
|
||||||
|
|
||||||
export const treeProps = () => {
|
export const treeProps = () => {
|
||||||
return {
|
return {
|
||||||
...vcTreeProps(),
|
...vcTreeProps(),
|
||||||
|
@ -130,8 +111,6 @@ export const treeProps = () => {
|
||||||
defaultSelectedKeys: { type: Array as PropType<Key[]> },
|
defaultSelectedKeys: { type: Array as PropType<Key[]> },
|
||||||
selectable: { type: Boolean, default: undefined },
|
selectable: { type: Boolean, default: undefined },
|
||||||
|
|
||||||
/** filter some AntTreeNodes as you need. it should return true */
|
|
||||||
filterAntTreeNode: { type: Function as PropType<(node: AntTreeNode) => boolean> },
|
|
||||||
loadedKeys: { type: Array as PropType<Key[]> },
|
loadedKeys: { type: Array as PropType<Key[]> },
|
||||||
draggable: { type: Boolean, default: undefined },
|
draggable: { type: Boolean, default: undefined },
|
||||||
showIcon: { type: Boolean, default: undefined },
|
showIcon: { type: Boolean, default: undefined },
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
title 的渲染逻辑
|
|
@ -6,13 +6,13 @@ export { EventDataNode, DataNode } from '../vc-tree/interface';
|
||||||
|
|
||||||
export {
|
export {
|
||||||
TreeProps,
|
TreeProps,
|
||||||
AntTreeNode,
|
|
||||||
AntTreeNodeMouseEvent,
|
AntTreeNodeMouseEvent,
|
||||||
AntTreeNodeExpandedEvent,
|
AntTreeNodeExpandedEvent,
|
||||||
AntTreeNodeCheckedEvent,
|
AntTreeNodeCheckedEvent,
|
||||||
AntTreeNodeSelectedEvent,
|
AntTreeNodeSelectedEvent,
|
||||||
AntdTreeNodeAttribute,
|
AntdTreeNodeAttribute,
|
||||||
AntTreeNodeProps,
|
AntTreeNodeProps,
|
||||||
|
TreeDataItem,
|
||||||
} from './Tree';
|
} from './Tree';
|
||||||
|
|
||||||
export { ExpandAction as DirectoryTreeExpandAction, DirectoryTreeProps } from './DirectoryTree';
|
export { ExpandAction as DirectoryTreeExpandAction, DirectoryTreeProps } from './DirectoryTree';
|
||||||
|
|
|
@ -58,7 +58,6 @@ export default defineComponent({
|
||||||
setup(props, { attrs, slots }) {
|
setup(props, { attrs, slots }) {
|
||||||
const destroyed = ref(false);
|
const destroyed = ref(false);
|
||||||
let delayedDragEnterLogic: Record<Key, number> = {};
|
let delayedDragEnterLogic: Record<Key, number> = {};
|
||||||
|
|
||||||
const indent = ref();
|
const indent = ref();
|
||||||
const selectedKeys = ref([]);
|
const selectedKeys = ref([]);
|
||||||
const checkedKeys = ref([]);
|
const checkedKeys = ref([]);
|
||||||
|
@ -147,7 +146,7 @@ export default defineComponent({
|
||||||
? conductExpandParent(props.expandedKeys, keyEntities.value)
|
? conductExpandParent(props.expandedKeys, keyEntities.value)
|
||||||
: props.expandedKeys;
|
: props.expandedKeys;
|
||||||
} else if (!init && props.defaultExpandAll) {
|
} else if (!init && props.defaultExpandAll) {
|
||||||
const cloneKeyEntities = { ...keyEntities };
|
const cloneKeyEntities = { ...keyEntities.value };
|
||||||
delete cloneKeyEntities[MOTION_KEY];
|
delete cloneKeyEntities[MOTION_KEY];
|
||||||
keys = Object.keys(cloneKeyEntities).map(key => cloneKeyEntities[key].key);
|
keys = Object.keys(cloneKeyEntities).map(key => cloneKeyEntities[key].key);
|
||||||
} else if (!init && props.defaultExpandedKeys) {
|
} else if (!init && props.defaultExpandedKeys) {
|
||||||
|
@ -223,7 +222,7 @@ export default defineComponent({
|
||||||
// =========================== Expanded ===========================
|
// =========================== Expanded ===========================
|
||||||
/** Set uncontrolled `expandedKeys`. This will also auto update `flattenNodes`. */
|
/** Set uncontrolled `expandedKeys`. This will also auto update `flattenNodes`. */
|
||||||
const setExpandedKeys = (keys: Key[]) => {
|
const setExpandedKeys = (keys: Key[]) => {
|
||||||
if (props.expandedKeys !== undefined) {
|
if (props.expandedKeys === undefined) {
|
||||||
expandedKeys.value = keys;
|
expandedKeys.value = keys;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -267,7 +266,6 @@ export default defineComponent({
|
||||||
const onNodeDragStart: NodeDragEventHandler = (event, node) => {
|
const onNodeDragStart: NodeDragEventHandler = (event, node) => {
|
||||||
const { onDragstart } = props;
|
const { onDragstart } = props;
|
||||||
const { eventKey, eventData } = node;
|
const { eventKey, eventData } = node;
|
||||||
|
|
||||||
dragNode = node;
|
dragNode = node;
|
||||||
dragStartMousePosition = {
|
dragStartMousePosition = {
|
||||||
x: event.clientX,
|
x: event.clientX,
|
||||||
|
@ -351,24 +349,22 @@ export default defineComponent({
|
||||||
// since if logic is on the bottom
|
// since if logic is on the bottom
|
||||||
// it will be blocked by abstract dragover node check
|
// it will be blocked by abstract dragover node check
|
||||||
// => if you dragenter from top, you mouse will still be consider as in the top node
|
// => if you dragenter from top, you mouse will still be consider as in the top node
|
||||||
(event as any).persist();
|
|
||||||
delayedDragEnterLogic[node.pos.value] = window.setTimeout(() => {
|
delayedDragEnterLogic[node.pos.value] = window.setTimeout(() => {
|
||||||
if (!dragState.dragging) return;
|
if (!dragState.dragging) return;
|
||||||
|
|
||||||
let newExpandedKeys = [...expandedKeys.value];
|
let newExpandedKeys = [...expandedKeys.value];
|
||||||
const entity = keyEntities[node.eventKey.value];
|
const entity = keyEntities.value[node.eventKey.value];
|
||||||
|
|
||||||
if (entity && (entity.children || []).length) {
|
if (entity && (entity.children || []).length) {
|
||||||
newExpandedKeys = arrAdd(expandedKeys.value, node.eventKey.value);
|
newExpandedKeys = arrAdd(expandedKeys.value, node.eventKey.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
setExpandedKeys(newExpandedKeys);
|
setExpandedKeys(newExpandedKeys);
|
||||||
|
|
||||||
if (onExpand) {
|
if (onExpand) {
|
||||||
onExpand(newExpandedKeys, {
|
onExpand(newExpandedKeys, {
|
||||||
node: node.eventData.value,
|
node: node.eventData.value,
|
||||||
expanded: true,
|
expanded: true,
|
||||||
nativeEvent: (event as any).nativeEvent,
|
nativeEvent: event,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}, 800);
|
}, 800);
|
||||||
|
@ -579,7 +575,7 @@ export default defineComponent({
|
||||||
})
|
})
|
||||||
.filter(node => node);
|
.filter(node => node);
|
||||||
|
|
||||||
if (props.selectedKeys !== undefined) {
|
if (props.selectedKeys === undefined) {
|
||||||
selectedKeys.value = newSelectedKeys;
|
selectedKeys.value = newSelectedKeys;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -589,7 +585,7 @@ export default defineComponent({
|
||||||
selected: targetSelected,
|
selected: targetSelected,
|
||||||
node: treeNode,
|
node: treeNode,
|
||||||
selectedNodes,
|
selectedNodes,
|
||||||
nativeEvent: (e as any).nativeEvent,
|
nativeEvent: e,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -604,7 +600,7 @@ export default defineComponent({
|
||||||
event: 'check',
|
event: 'check',
|
||||||
node: treeNode,
|
node: treeNode,
|
||||||
checked,
|
checked,
|
||||||
nativeEvent: (e as any).nativeEvent,
|
nativeEvent: e,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (checkStrictly) {
|
if (checkStrictly) {
|
||||||
|
@ -615,11 +611,11 @@ export default defineComponent({
|
||||||
checkedObj = { checked: newCheckedKeys, halfChecked: newHalfCheckedKeys };
|
checkedObj = { checked: newCheckedKeys, halfChecked: newHalfCheckedKeys };
|
||||||
|
|
||||||
eventObj.checkedNodes = newCheckedKeys
|
eventObj.checkedNodes = newCheckedKeys
|
||||||
.map(checkedKey => keyEntities[checkedKey])
|
.map(checkedKey => keyEntities.value[checkedKey])
|
||||||
.filter(entity => entity)
|
.filter(entity => entity)
|
||||||
.map(entity => entity.node);
|
.map(entity => entity.node);
|
||||||
|
|
||||||
if (props.checkedKeys !== undefined) {
|
if (props.checkedKeys === undefined) {
|
||||||
checkedKeys.value = newCheckedKeys;
|
checkedKeys.value = newCheckedKeys;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -647,17 +643,16 @@ export default defineComponent({
|
||||||
eventObj.checkedNodes = [];
|
eventObj.checkedNodes = [];
|
||||||
eventObj.checkedNodesPositions = [];
|
eventObj.checkedNodesPositions = [];
|
||||||
eventObj.halfCheckedKeys = newHalfCheckedKeys;
|
eventObj.halfCheckedKeys = newHalfCheckedKeys;
|
||||||
|
console.log(eventObj);
|
||||||
newCheckedKeys.forEach(checkedKey => {
|
newCheckedKeys.forEach(checkedKey => {
|
||||||
const entity = keyEntities.value[checkedKey];
|
const entity = keyEntities.value[checkedKey];
|
||||||
if (!entity) return;
|
if (!entity) return;
|
||||||
|
|
||||||
const { node, pos } = entity;
|
const { node, pos } = entity;
|
||||||
|
|
||||||
eventObj.checkedNodes.push(node);
|
eventObj.checkedNodes.push(node);
|
||||||
eventObj.checkedNodesPositions.push({ node, pos });
|
eventObj.checkedNodesPositions.push({ node, pos });
|
||||||
});
|
});
|
||||||
if (props.checkedKeys !== undefined) {
|
if (props.checkedKeys === undefined) {
|
||||||
checkedKeys.value = newCheckedKeys;
|
checkedKeys.value = newCheckedKeys;
|
||||||
halfCheckedKeys.value = newHalfCheckedKeys;
|
halfCheckedKeys.value = newHalfCheckedKeys;
|
||||||
}
|
}
|
||||||
|
@ -698,7 +693,7 @@ export default defineComponent({
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (props.loadedKeys !== undefined) {
|
if (props.loadedKeys === undefined) {
|
||||||
loadedKeys.value = newLoadedKeys;
|
loadedKeys.value = newLoadedKeys;
|
||||||
}
|
}
|
||||||
loadingKeys.value = newLoadingKeys;
|
loadingKeys.value = newLoadingKeys;
|
||||||
|
@ -785,7 +780,7 @@ export default defineComponent({
|
||||||
onExpand(newExpandedKeys, {
|
onExpand(newExpandedKeys, {
|
||||||
node: treeNode,
|
node: treeNode,
|
||||||
expanded: targetExpanded,
|
expanded: targetExpanded,
|
||||||
nativeEvent: (e as any).nativeEvent,
|
nativeEvent: e,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
2
v2-doc
2
v2-doc
|
@ -1 +1 @@
|
||||||
Subproject commit d571ad4bf772cfc372511dc1dedf07981dc56ae8
|
Subproject commit 2e39bc81a84e2cfa90e8863e8f18d5a3d3ab1995
|
Loading…
Reference in New Issue