diff --git a/packages/devui-vue/devui/tree/src/composables/use-highlight.ts b/packages/devui-vue/devui/tree/src/composables/use-highlight.ts index 93f20dd56b235a38cb5b81af348ce2d56f3ded9d..f63e45b78937b39667142fbcbb2e087a632f7311 100644 --- a/packages/devui-vue/devui/tree/src/composables/use-highlight.ts +++ b/packages/devui-vue/devui/tree/src/composables/use-highlight.ts @@ -1,37 +1,42 @@ import { ref, Ref } from 'vue' -interface TypeHighlightClass { - [key: string]: 'active' | '' | 'devui-tree_isDisabledNode' -} +type TypeHighlightClass = 'active' | '' | 'devui-tree_isDisabledNode' + type TypeUseHighlightNode = () => { - nodeClassNameReflect: Ref - handleClickOnNode: (index: string) => void - handleInitNodeClassNameReflect: (isDisabled: boolean, ...keys: Array) => string + currentHighLightNodeKey: Ref + highLightClick: (index: string) => void + initHighLightNode: (isDisabled: boolean, key: string) => void, + getHighLightClass: (key: string) => TypeHighlightClass } const HIGHLIGHT_CLASS = 'active' const IS_DISABLED_FLAG = 'devui-tree_isDisabledNode' +const disabledNodeSet = new Set() + const useHighlightNode: TypeUseHighlightNode = () => { - const nodeClassNameReflectRef = ref({}) - const prevActiveNodeKey = ref('') - const handleInit = (isDisabled = false, ...keys) => { - const key = keys.join('-') - nodeClassNameReflectRef.value[key] = isDisabled - ? IS_DISABLED_FLAG - : nodeClassNameReflectRef.value[key] || '' - return key + + const currentHighLightNodeKey = ref() + + const highLightClick = (key: string): void => { + if (disabledNodeSet.has(key)) return + currentHighLightNodeKey.value = key } - const handleClick = (key) => { - if (nodeClassNameReflectRef.value[key] === IS_DISABLED_FLAG) return - if (prevActiveNodeKey.value === key) return - if (prevActiveNodeKey.value) nodeClassNameReflectRef.value[prevActiveNodeKey.value] = '' - nodeClassNameReflectRef.value[key] = HIGHLIGHT_CLASS - prevActiveNodeKey.value = key + + const initHighLightNode = (isDisabled: boolean, key: string): void => { + if (isDisabled) disabledNodeSet.add(key) } + + const getHighLightClass = ((key: string): TypeHighlightClass => { + if (disabledNodeSet.has(key)) return IS_DISABLED_FLAG + if (key === currentHighLightNodeKey.value) return HIGHLIGHT_CLASS + return '' + }) + return { - nodeClassNameReflect: nodeClassNameReflectRef, - handleClickOnNode: handleClick, - handleInitNodeClassNameReflect: handleInit + currentHighLightNodeKey, + highLightClick, + initHighLightNode, + getHighLightClass } } export default useHighlightNode diff --git a/packages/devui-vue/devui/tree/src/tree.tsx b/packages/devui-vue/devui/tree/src/tree.tsx index 7239b04a647643dd5d601779fce3ea7678d86fc1..f99292c7372d2be73e483f7505c2fbe48d0df32e 100644 --- a/packages/devui-vue/devui/tree/src/tree.tsx +++ b/packages/devui-vue/devui/tree/src/tree.tsx @@ -1,7 +1,7 @@ import { defineComponent, reactive, toRefs, provide } from 'vue' import type { SetupContext } from 'vue' import { treeProps, TreeProps, TreeItem, TreeRootType } from './tree-types' -import { CHECK_CONFIG } from './config' +import { CHECK_CONFIG } from './config' import { preCheckTree, deleteNode, getId } from './util' import Loading from '../../loading/src/service' import Checkbox from '../../checkbox/src/checkbox' @@ -24,7 +24,7 @@ export default defineComponent({ const { data, checkable, checkableRelation: cbr } = toRefs(reactive({ ...props, data: preCheckTree(props.data) })) const { mergeData } = useMergeNode(data.value) const { openedData, toggle } = useToggle(mergeData) - const { nodeClassNameReflect, handleInitNodeClassNameReflect, handleClickOnNode } = useHighlightNode() + const { getHighLightClass, initHighLightNode, highLightClick } = useHighlightNode() const { lazyNodesReflect, handleInitLazyNodeReflect, getLazyData } = useLazy() const { selected, onNodeClick } = useChecked(cbr, ctx, data.value) const { editStatusReflect, operateIconReflect, handleReflectIdToIcon } = useOperate(data) @@ -65,7 +65,7 @@ export default defineComponent({ }, } ) - handleInitNodeClassNameReflect(disabled, id) + initHighLightNode(disabled, id) handleInitLazyNodeReflect(item, { id, onGetNodeData: async () => { @@ -103,10 +103,10 @@ export default defineComponent({ } return ( isParent || children && children.length - ? open - ? - : - : + ? open + ? + : + : ) } const checkState = CHECK_CONFIG[selected.value[id] ?? 'none'] @@ -116,14 +116,14 @@ export default defineComponent({ style={{ paddingLeft: `${24 * (level - 1)}px` }} >
handleClickOnNode(id)} + class={`devui-tree-node__content ${getHighLightClass(id)}`} + onClick={() => highLightClick(id)} >
- { renderFoldIcon(item) } - { checkable.value && onNodeClick(item)} disabled={disabled} {...checkState} /> } + {renderFoldIcon(item)} + {checkable.value && onNodeClick(item)} disabled={disabled} {...checkState} />} - { operateIconReflect.value.find(({ id: d }) => id === d).renderIcon(item) } + {operateIconReflect.value.find(({ id: d }) => id === d).renderIcon(item)} { item.isParent ?
@@ -152,7 +152,7 @@ export default defineComponent({ return (
{/* { renderTree(data.value) } */} - { openedData.value.map(item => renderNode(item)) } + {openedData.value.map(item => renderNode(item))}
) }