Skip to content

Commit 51500cf

Browse files
committed
feat: 增加图标自定义和勾选功能
1 parent 1c5cdfd commit 51500cf

File tree

3 files changed

+49
-7
lines changed

3 files changed

+49
-7
lines changed

packages/devui-vue/devui/tree/src/tree-types.ts

+6
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ export interface TreeItem {
55
children?: TreeData;
66
disableToggle?: boolean;
77
disabled?: boolean;
8+
checked?: boolean, // 是否勾选
89
[key: string]: any;
910
}
1011

@@ -15,6 +16,11 @@ export const treeProps = {
1516
type: Array as PropType<TreeData>,
1617
default: () => [],
1718
},
19+
// 新增
20+
checkable: {
21+
type: Boolean,
22+
default: false
23+
},
1824
} as const;
1925

2026
export type TreeProps = ExtractPropTypes<typeof treeProps>;

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

+15-6
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ export default defineComponent({
1010
name: 'DTree',
1111
props: treeProps,
1212
emits: [],
13-
setup(props: TreeProps, ctx) {
14-
const { data } = toRefs(props)
13+
setup(props: TreeProps, { slots }) {
14+
const { data, checkable } = toRefs(props)
1515
const { openedData, toggle } = useToggle(data.value)
1616
const { nodeClassNameReflect, handleInitNodeClassNameReflect, handleClickOnNode } = useHighlightNode()
1717

@@ -22,11 +22,16 @@ export default defineComponent({
2222

2323
const renderIcon = (item: TreeItem) => {
2424
return item.children
25-
? <span class={item.disableToggle && 'toggle-disabled'}>
25+
? <span
26+
class={item.disableToggle && 'toggle-disabled'}
27+
onClick={() => toggle(item)}>
2628
{
27-
item.open
28-
? <IconOpen class='mr-xs' onClick={() => toggle(item)} />
29-
: <IconClose class='mr-xs' onClick={() => toggle(item)} />
29+
// 增加插槽逻辑
30+
slots.icon
31+
? slots.icon(item)
32+
: item.open
33+
? <IconOpen class='mr-xs' />
34+
: <IconClose class='mr-xs' />
3035
}
3136
</span>
3237
: <Indent />
@@ -46,6 +51,10 @@ export default defineComponent({
4651
<div class="devui-tree-node__content--value-wrapper">
4752
{/* 折叠图标 */}
4853
{renderIcon(item)}
54+
{/* 复选框 */}
55+
{/* { checkable.value && <d-checkbox v-model={item.checked} />} */}
56+
{ checkable.value && <input type="checkbox" v-model={item.checked} />}
57+
{/* 文本 */}
4958
<span class={[
5059
'devui-tree-node__title',
5160
item.disabled && 'select-disabled']}>

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

+28-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,34 @@
44

55
```vue
66
<template>
7-
<d-tree :data="data"></d-tree>
7+
<d-tree :data="data" checkable>
8+
<template #icon="item">
9+
<svg
10+
class="icon"
11+
viewBox="0 0 1024 1024"
12+
version="1.1"
13+
xmlns="http://www.w3.org/2000/svg"
14+
p-id="4160"
15+
width="12"
16+
height="12"
17+
v-if="item.open"
18+
>
19+
<path d="M64 320l448 448 448-448z" fill="#8C92A4" p-id="4161"></path>
20+
</svg>
21+
<svg
22+
class="icon"
23+
viewBox="0 0 1024 1024"
24+
version="1.1"
25+
xmlns="http://www.w3.org/2000/svg"
26+
p-id="4361"
27+
width="12"
28+
height="12"
29+
v-else
30+
>
31+
<path d="M256 64l448 448-448 448z" fill="#8C92A4" p-id="4362"></path>
32+
</svg>
33+
</template>
34+
</d-tree>
835
</template>
936
1037
<script lang="ts">

0 commit comments

Comments
 (0)