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 { defineComponent } from 'vue';
|
||||
import classNames from '../_util/classNames';
|
||||
|
@ -7,7 +7,7 @@ import animation from '../_util/openAnimation';
|
|||
import PropTypes from '../_util/vue-types';
|
||||
import { filterEmpty } from '../_util/props-util';
|
||||
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 useConfigInject from '../_util/hooks/useConfigInject';
|
||||
import renderSwitcherIcon from './utils/iconUtil';
|
||||
|
@ -33,36 +33,20 @@ export interface AntdTreeNodeAttribute {
|
|||
disableCheckbox: boolean;
|
||||
}
|
||||
|
||||
export interface AntTreeNodeProps {
|
||||
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 AntTreeNodeProps = DataNode;
|
||||
|
||||
export type AntTreeNode = DefineComponent<AntTreeNodeProps, {}>;
|
||||
// [Legacy] Compatible for v2
|
||||
export type TreeDataItem = DataNode;
|
||||
|
||||
export interface AntTreeNodeBaseEvent {
|
||||
node: AntTreeNode;
|
||||
node: DataNode;
|
||||
nativeEvent: MouseEvent;
|
||||
}
|
||||
|
||||
export interface AntTreeNodeCheckedEvent extends AntTreeNodeBaseEvent {
|
||||
event: 'check';
|
||||
checked?: boolean;
|
||||
checkedNodes?: AntTreeNode[];
|
||||
checkedNodes?: DataNode[];
|
||||
}
|
||||
|
||||
export interface AntTreeNodeSelectedEvent extends AntTreeNodeBaseEvent {
|
||||
|
@ -76,7 +60,7 @@ export interface AntTreeNodeExpandedEvent extends AntTreeNodeBaseEvent {
|
|||
}
|
||||
|
||||
export interface AntTreeNodeMouseEvent {
|
||||
node: AntTreeNode;
|
||||
node: DataNode;
|
||||
event: DragEvent;
|
||||
}
|
||||
|
||||
|
@ -85,17 +69,14 @@ export interface AntTreeNodeDragEnterEvent extends AntTreeNodeMouseEvent {
|
|||
}
|
||||
|
||||
export interface AntTreeNodeDropEvent {
|
||||
node: AntTreeNode;
|
||||
dragNode: AntTreeNode;
|
||||
node: DragNodeEvent;
|
||||
dragNode: DragNodeEvent;
|
||||
dragNodesKeys: Key[];
|
||||
dropPosition: number;
|
||||
dropToGap?: boolean;
|
||||
event: MouseEvent;
|
||||
}
|
||||
|
||||
// [Legacy] Compatible for v2
|
||||
export type TreeDataItem = DataNode;
|
||||
|
||||
export const treeProps = () => {
|
||||
return {
|
||||
...vcTreeProps(),
|
||||
|
@ -130,8 +111,6 @@ export const treeProps = () => {
|
|||
defaultSelectedKeys: { type: Array as PropType<Key[]> },
|
||||
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[]> },
|
||||
draggable: { 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 {
|
||||
TreeProps,
|
||||
AntTreeNode,
|
||||
AntTreeNodeMouseEvent,
|
||||
AntTreeNodeExpandedEvent,
|
||||
AntTreeNodeCheckedEvent,
|
||||
AntTreeNodeSelectedEvent,
|
||||
AntdTreeNodeAttribute,
|
||||
AntTreeNodeProps,
|
||||
TreeDataItem,
|
||||
} from './Tree';
|
||||
|
||||
export { ExpandAction as DirectoryTreeExpandAction, DirectoryTreeProps } from './DirectoryTree';
|
||||
|
|
|
@ -58,7 +58,6 @@ export default defineComponent({
|
|||
setup(props, { attrs, slots }) {
|
||||
const destroyed = ref(false);
|
||||
let delayedDragEnterLogic: Record<Key, number> = {};
|
||||
|
||||
const indent = ref();
|
||||
const selectedKeys = ref([]);
|
||||
const checkedKeys = ref([]);
|
||||
|
@ -147,7 +146,7 @@ export default defineComponent({
|
|||
? conductExpandParent(props.expandedKeys, keyEntities.value)
|
||||
: props.expandedKeys;
|
||||
} else if (!init && props.defaultExpandAll) {
|
||||
const cloneKeyEntities = { ...keyEntities };
|
||||
const cloneKeyEntities = { ...keyEntities.value };
|
||||
delete cloneKeyEntities[MOTION_KEY];
|
||||
keys = Object.keys(cloneKeyEntities).map(key => cloneKeyEntities[key].key);
|
||||
} else if (!init && props.defaultExpandedKeys) {
|
||||
|
@ -223,7 +222,7 @@ export default defineComponent({
|
|||
// =========================== Expanded ===========================
|
||||
/** Set uncontrolled `expandedKeys`. This will also auto update `flattenNodes`. */
|
||||
const setExpandedKeys = (keys: Key[]) => {
|
||||
if (props.expandedKeys !== undefined) {
|
||||
if (props.expandedKeys === undefined) {
|
||||
expandedKeys.value = keys;
|
||||
}
|
||||
};
|
||||
|
@ -267,7 +266,6 @@ export default defineComponent({
|
|||
const onNodeDragStart: NodeDragEventHandler = (event, node) => {
|
||||
const { onDragstart } = props;
|
||||
const { eventKey, eventData } = node;
|
||||
|
||||
dragNode = node;
|
||||
dragStartMousePosition = {
|
||||
x: event.clientX,
|
||||
|
@ -351,24 +349,22 @@ export default defineComponent({
|
|||
// since if logic is on the bottom
|
||||
// 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
|
||||
(event as any).persist();
|
||||
delayedDragEnterLogic[node.pos.value] = window.setTimeout(() => {
|
||||
if (!dragState.dragging) return;
|
||||
|
||||
let newExpandedKeys = [...expandedKeys.value];
|
||||
const entity = keyEntities[node.eventKey.value];
|
||||
const entity = keyEntities.value[node.eventKey.value];
|
||||
|
||||
if (entity && (entity.children || []).length) {
|
||||
newExpandedKeys = arrAdd(expandedKeys.value, node.eventKey.value);
|
||||
}
|
||||
|
||||
setExpandedKeys(newExpandedKeys);
|
||||
|
||||
if (onExpand) {
|
||||
onExpand(newExpandedKeys, {
|
||||
node: node.eventData.value,
|
||||
expanded: true,
|
||||
nativeEvent: (event as any).nativeEvent,
|
||||
nativeEvent: event,
|
||||
});
|
||||
}
|
||||
}, 800);
|
||||
|
@ -579,7 +575,7 @@ export default defineComponent({
|
|||
})
|
||||
.filter(node => node);
|
||||
|
||||
if (props.selectedKeys !== undefined) {
|
||||
if (props.selectedKeys === undefined) {
|
||||
selectedKeys.value = newSelectedKeys;
|
||||
}
|
||||
|
||||
|
@ -589,7 +585,7 @@ export default defineComponent({
|
|||
selected: targetSelected,
|
||||
node: treeNode,
|
||||
selectedNodes,
|
||||
nativeEvent: (e as any).nativeEvent,
|
||||
nativeEvent: e,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
@ -604,7 +600,7 @@ export default defineComponent({
|
|||
event: 'check',
|
||||
node: treeNode,
|
||||
checked,
|
||||
nativeEvent: (e as any).nativeEvent,
|
||||
nativeEvent: e,
|
||||
};
|
||||
|
||||
if (checkStrictly) {
|
||||
|
@ -615,11 +611,11 @@ export default defineComponent({
|
|||
checkedObj = { checked: newCheckedKeys, halfChecked: newHalfCheckedKeys };
|
||||
|
||||
eventObj.checkedNodes = newCheckedKeys
|
||||
.map(checkedKey => keyEntities[checkedKey])
|
||||
.map(checkedKey => keyEntities.value[checkedKey])
|
||||
.filter(entity => entity)
|
||||
.map(entity => entity.node);
|
||||
|
||||
if (props.checkedKeys !== undefined) {
|
||||
if (props.checkedKeys === undefined) {
|
||||
checkedKeys.value = newCheckedKeys;
|
||||
}
|
||||
} else {
|
||||
|
@ -647,17 +643,16 @@ export default defineComponent({
|
|||
eventObj.checkedNodes = [];
|
||||
eventObj.checkedNodesPositions = [];
|
||||
eventObj.halfCheckedKeys = newHalfCheckedKeys;
|
||||
|
||||
console.log(eventObj);
|
||||
newCheckedKeys.forEach(checkedKey => {
|
||||
const entity = keyEntities.value[checkedKey];
|
||||
if (!entity) return;
|
||||
|
||||
const { node, pos } = entity;
|
||||
|
||||
eventObj.checkedNodes.push(node);
|
||||
eventObj.checkedNodesPositions.push({ node, pos });
|
||||
});
|
||||
if (props.checkedKeys !== undefined) {
|
||||
if (props.checkedKeys === undefined) {
|
||||
checkedKeys.value = newCheckedKeys;
|
||||
halfCheckedKeys.value = newHalfCheckedKeys;
|
||||
}
|
||||
|
@ -698,7 +693,7 @@ export default defineComponent({
|
|||
});
|
||||
}
|
||||
|
||||
if (props.loadedKeys !== undefined) {
|
||||
if (props.loadedKeys === undefined) {
|
||||
loadedKeys.value = newLoadedKeys;
|
||||
}
|
||||
loadingKeys.value = newLoadingKeys;
|
||||
|
@ -785,7 +780,7 @@ export default defineComponent({
|
|||
onExpand(newExpandedKeys, {
|
||||
node: treeNode,
|
||||
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