Skip to content

Commit 2a8f25e

Browse files
authored
feat(tree): add tree content/icon slot (DevCloudFE#405)
* feat(tree): 增加content插槽 * feat(tree): 增加icon插槽
1 parent 9c1d687 commit 2a8f25e

File tree

4 files changed

+68
-8
lines changed

4 files changed

+68
-8
lines changed
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { defineComponent, PropType, toRefs } from 'vue';
2+
import { ITreeNode } from '../core/use-tree-types';
3+
import useTreeNode from './use-tree-node';
4+
5+
export default defineComponent({
6+
name: 'DTreeNodeContent',
7+
props: {
8+
data: {
9+
type: Object as PropType<ITreeNode>,
10+
},
11+
},
12+
setup(props) {
13+
const { data } = toRefs(props);
14+
const {
15+
nodeTitleClass,
16+
} = useTreeNode(data);
17+
18+
return () => {
19+
return (
20+
<span class={nodeTitleClass.value}>{data.value?.label}</span>
21+
);
22+
};
23+
},
24+
});

packages/devui-vue/devui/tree/src/components/tree-node.tsx

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
import { defineComponent, inject, PropType, toRefs } from 'vue';
1+
import { defineComponent, inject, PropType, renderSlot, toRefs, useSlots } from 'vue';
22
import { NODE_HEIGHT, USE_TREE_TOKEN } from '../const';
33
import { IInnerTreeNode } from '../core/use-tree-types';
44
import DTreeNodeToggle from './tree-node-toggle';
55
import { Checkbox } from '../../../checkbox';
6+
import DTreeNodeContent from './tree-node-content';
67
import useTreeNode from './use-tree-node';
78

89
export default defineComponent({
@@ -12,15 +13,14 @@ export default defineComponent({
1213
type: Object as PropType<IInnerTreeNode>,
1314
},
1415
},
15-
setup(props) {
16+
setup(props, { slots }) {
1617
const { data } = toRefs(props);
17-
const { selectNode, toggleCheckNode } = inject(USE_TREE_TOKEN);
18+
const { selectNode, toggleCheckNode, toggleNode } = inject(USE_TREE_TOKEN);
1819

1920
const {
2021
nodeClass,
2122
nodeStyle,
2223
nodeContentClass,
23-
nodeTitleClass,
2424
nodeVLineClass,
2525
nodeVLineStyle,
2626
nodeHLineClass,
@@ -32,7 +32,11 @@ export default defineComponent({
3232
<span class={nodeVLineClass.value} style={nodeVLineStyle.value}></span>
3333
<div class={nodeContentClass.value} onClick={() => { selectNode(data.value); }}>
3434
<span class={nodeHLineClass.value}></span>
35-
<DTreeNodeToggle data={data.value} />
35+
{
36+
slots.icon
37+
? renderSlot(useSlots(), 'icon', { nodeData: data, toggleNode })
38+
: <DTreeNodeToggle data={data.value} />
39+
}
3640
<div class="devui-tree-node__content--value-wrapper" style={{ height: `${NODE_HEIGHT}px`}}>
3741
<Checkbox
3842
key={data.value?.id}
@@ -41,7 +45,11 @@ export default defineComponent({
4145
onUpdate:modelValue={() => { toggleCheckNode(data.value); }}
4246
onClick={(event: MouseEvent) => { event.stopPropagation(); }}
4347
/>
44-
<span class={nodeTitleClass.value}>{data.value?.label}</span>
48+
{
49+
slots.default
50+
? renderSlot(useSlots(), 'default', { nodeData: data })
51+
: <DTreeNodeContent data={data} />
52+
}
4553
</div>
4654
</div>
4755
</div>

packages/devui-vue/devui/tree/src/new-tree.tsx

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import { defineComponent, PropType, provide, renderSlot, toRefs, useSlots, watch } from 'vue';
22
import type { ITreeNode } from './core/use-tree-types';
33
import DTreeNode from './components/tree-node';
4+
import DTreeNodeContent from './components/tree-node-content';
5+
import DTreeNodeToggle from './components/tree-node-toggle';
46
import useTree from './core/use-tree';
57
import useCheck from './core/use-check';
68
import useSelect from './core/use-select';
@@ -26,6 +28,7 @@ export default defineComponent({
2628
const {
2729
setTree,
2830
getExpendedTree,
31+
toggleNode,
2932
} = treeFactory;
3033

3134
// 外部同步内部
@@ -42,7 +45,16 @@ export default defineComponent({
4245
? renderSlot(useSlots(), 'default', {
4346
treeFactory: treeFactory, nodeData: treeNode
4447
})
45-
: <DTreeNode data={treeNode} />
48+
: <DTreeNode data={treeNode}>
49+
{{
50+
default: () => slots.content
51+
? renderSlot(useSlots(), 'content', { nodeData: treeNode })
52+
: <DTreeNodeContent data={treeNode} />,
53+
icon: () => slots.icon
54+
? renderSlot(useSlots(), 'icon', { nodeData: treeNode, toggleNode })
55+
: <DTreeNodeToggle data={treeNode} />,
56+
}}
57+
</DTreeNode>
4658
))
4759
}
4860
</div>

packages/devui-vue/docs/components/tree/index.md

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1038,7 +1038,23 @@ export default defineComponent({
10381038
```vue
10391039
<template>
10401040
<d-button @click="changeData">changeData</d-button>
1041-
<d-new-tree :data="data"></d-new-tree>
1041+
<d-new-tree :data="data">
1042+
<template #content="{nodeData}">
1043+
<svg t="1649231851892" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2194" width="16" height="16"><path d="M946.5 505L560.1 118.8l-25.9-25.9c-12.3-12.2-32.1-12.2-44.4 0L77.5 505c-12.3 12.3-18.9 28.6-18.8 46 0.4 35.2 29.7 63.3 64.9 63.3h42.5V940h691.8V614.3h43.4c17.1 0 33.2-6.7 45.3-18.8 12.1-12.1 18.7-28.2 18.7-45.3 0-17-6.7-33.1-18.8-45.2zM568 868H456V664h112v204z m217.9-325.7V868H632V640c0-22.1-17.9-40-40-40H432c-22.1 0-40 17.9-40 40v228H238.1V542.3h-96l370-369.7 23.1 23.1L882 542.3h-96.1z" p-id="2195"></path></svg>
1044+
{{nodeData.label}}
1045+
</template>
1046+
<template #icon="{nodeData, toggleNode}">
1047+
<span v-if="nodeData.isLeaf" class="devui-tree-node__indent"></span>
1048+
<span v-else @click="(event) => {
1049+
event.stopPropagation();
1050+
toggleNode(nodeData);
1051+
}"
1052+
>
1053+
<svg v-if="!nodeData.expanded" t="1649233280637" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4033" width="12" height="12"><path d="M204.58705 951.162088 204.58705 72.836889 819.41295 511.998977Z" p-id="4034" fill="#c0c4cc"></path></svg>
1054+
<svg v-else t="1649232304515" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3732" width="12" height="12"><path d="M511.999488 819.413462 72.8374 204.586538 951.1626 204.586538Z" p-id="3733" fill="#c0c4cc"></path></svg>
1055+
</span>
1056+
</template>
1057+
</d-new-tree>
10421058
</template>
10431059
<script lang="ts">
10441060
import { defineComponent, ref } from 'vue';

0 commit comments

Comments
 (0)