refactor: tree

pull/4577/head
tangjinzhou 2021-08-18 15:36:57 +08:00
parent 9cbaeabbd6
commit 5f189f534e
5 changed files with 26 additions and 51 deletions

View File

@ -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 },

View File

@ -0,0 +1 @@
title 的渲染逻辑

View File

@ -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';

View File

@ -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

@ -1 +1 @@
Subproject commit d571ad4bf772cfc372511dc1dedf07981dc56ae8 Subproject commit 2e39bc81a84e2cfa90e8863e8f18d5a3d3ab1995