yangyin
2024-10-31 05f34e1af59e139e6e914e772ba7dcd5b4bf680d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
<template>
    <div class="select_box">
        <el-tree-select
            ref="treeselect"
            :currentNodeKey="currentNodeKey1"
            :highlight-current="true"
            :node-key="selectProp.id"
            filterable
            :check-strictly="checkStrictly"
            :props="selectProp"
            v-model="selectValue"
            :data="selectData"
            :clearable="clearable"
            placeholder="请选择"
            :expandNode="expandNode"
            @node-click="selectchange"
            :auto-expand-parent="true"
            :render-after-expand="renderAfterExpand"
        >
            <template #default="{ node, data }">
                <span class="custom-tree-node">
                    <span style="display: flex; justify-content: center; align-items: center">
                        <SvgIcon v-if="data.Children && data.Children.length > 0" name="ele-Folder" :size="18" class="span_color"></SvgIcon>
                        <SvgIcon v-else name="ele-Document" :size="14" class="span_color"></SvgIcon>
                        {{ node.label }}
                    </span>
                </span>
            </template>
        </el-tree-select>
    </div>
</template>
<script lang="ts" setup name="treeSelectByMgr">
import { toRefs, ref, watch, onMounted, nextTick } from 'vue';
const props = defineProps({
    checkStrictly: {
        type: Boolean,
        default: false,
    },
    defaultSelectValue: {
        type: String,
        default: () => {
            return '';
        },
    },
    currentNodeKey: {
        type: [String, Number],
        default: () => {
            return '';
        },
    },
    selectData: {
        type: Array,
        default: () => {
            return [];
        },
    },
    selectProp: {
        type: Object,
        default:()=>({
            id: 'ID',
            label: 'Name',
            children: 'Children',
        }),
    },
    clearable: {
        type: Boolean,
        default: false,
    },
    expandNode: {
        type: Boolean,
        default: false,
    },
    renderAfterExpand: {
        type: Boolean,
        default: false,
    },
});
const { checkStrictly, defaultSelectValue, currentNodeKey, selectData, selectProp, clearable, expandNode, renderAfterExpand } = toRefs(props);
 
const emits = defineEmits<{
    (event: 'nodeClick', node: any): void;
}>();
 
let selectValue = ref('');
let currentNodeKey1 = ref(null);
 
const treeselect = ref();
onMounted(() => {
    selectValue.value = defaultSelectValue.value;
});
const selectchange = (node) => {
    emits('nodeClick', node);
};
watch(defaultSelectValue, (val) => {
    selectValue.value = val;
});
watch(currentNodeKey, (val) => {
    let key = val;
    if (selectData.value.length && key === '') {
        key = selectData.value[0][selectProp.value.id];
    }
    currentNodeKey1.value = key;
    nextTick(() => {
        treeselect.value.setCurrentKey(key); // 设置默认选中
    });
});
</script>
 
<style scoped>
.select_box {
    width: 100%;
    height: 100%;
}
.span_color {
    font-size: 18px;
    color: rgb(64, 158, 255);
    width: 18px;
    height: 18px;
    margin-right: 5px;
}
.custom-tree-node {
    flex: 1;
    display: flex;
    align-items: center;
    justify-content: space-between;
    font-size: 14px;
    padding-right: 8px;
}
</style>