diff --git a/devui/tree/src/tree-node-content.tsx b/devui/tree/src/tree-node-content.tsx new file mode 100644 index 0000000000000000000000000000000000000000..f6a3b2eabb9adcd97006acd0685e2d12e246d6fa --- /dev/null +++ b/devui/tree/src/tree-node-content.tsx @@ -0,0 +1,22 @@ +import { defineComponent, h, inject } from 'vue'; +import { TreeRootType } from './tree-types'; + +export default defineComponent({ + name: 'DTreeNodeContent', + props: { + node: { + type: Object, + required: true, + }, + }, + setup(props) { + const tree = inject('treeRoot'); + return () => { + const node = props.node; + const { disabled, label } = node; + return tree.ctx.slots.default + ? tree.ctx.slots.default({ node }) + : { label }; + }; + }, +}); diff --git a/devui/tree/src/tree-types.ts b/devui/tree/src/tree-types.ts index 1af7c611a55f22af2c21479f717c0115f772f71f..09304c4cf0083a20f746dd204fb9b7319c7d1426 100644 --- a/devui/tree/src/tree-types.ts +++ b/devui/tree/src/tree-types.ts @@ -1,4 +1,4 @@ -import type { PropType, ExtractPropTypes } from 'vue' +import type { PropType, ExtractPropTypes, SetupContext } from 'vue' export interface TreeItem { label: string @@ -17,3 +17,8 @@ export const treeProps = { } as const export type TreeProps = ExtractPropTypes + +export interface TreeRootType { + ctx: SetupContext + props: TreeProps +} \ No newline at end of file diff --git a/devui/tree/src/tree.tsx b/devui/tree/src/tree.tsx index 0d7fae875a7f2bb3fe14f82ef15542b46bd4ce04..0f65be8cd70d9173ef8809170c33842f2242d354 100644 --- a/devui/tree/src/tree.tsx +++ b/devui/tree/src/tree.tsx @@ -1,18 +1,19 @@ -import { defineComponent, toRefs } from 'vue' -import { treeProps, TreeProps } from './tree-types' +import { defineComponent, toRefs, provide } from 'vue' +import { treeProps, TreeProps, TreeRootType } from './tree-types' import { flatten } from './util' import useToggle from './composables/use-toggle' import useMergeNode from './composables/use-merge-node' import useHighlightNode from './composables/use-highlight' import IconOpen from './assets/open.svg' import IconClose from './assets/close.svg' +import NodeContent from './tree-node-content' import './tree.scss' export default defineComponent({ name: 'DTree', props: treeProps, emits: [], - setup(props: TreeProps) { + setup(props: TreeProps, ctx) { const { data } = toRefs(props) const flatData = flatten(data.value) @@ -21,6 +22,7 @@ export default defineComponent({ const { openedData, toggle } = useToggle(mergeData.value) const { nodeClassNameReflect, handleInitNodeClassNameReflect, handleClickOnNode } = useHighlightNode() + provide('treeRoot', { ctx, props }); const Indent = () => { return } @@ -46,9 +48,7 @@ export default defineComponent({ : toggle(target, item)} /> : } - - { label } - + diff --git a/docs/components/tree/index.md b/docs/components/tree/index.md index f2c350b69f3621f65a0f17cb3c26b670e69cc2f1..a9969358f2f829a0928a5baa3b2f7a5b212193a5 100644 --- a/docs/components/tree/index.md +++ b/docs/components/tree/index.md @@ -270,4 +270,220 @@ export default defineComponent({ }) ``` +::: + +### 自定义图标 + +:::demo 自定义操作按钮图标、节点图标。 + +```vue + + + + +``` ::: \ No newline at end of file