这是我封装的一个tree组件,我该如何在其他组件中使用他 - CSDN文库",
"datePublished": "2025-06-11",
"keywords": "
<template>
<div class="custom-tree-container">
<!-- 搜索框 -->
<el-input
v-if="showSearch"
v-model="filterText"
placeholder="输入关键字过滤"
clearable
class="tree-search"
/>
<!-- 树形组件 -->
<el-tree
ref="treeRef"
:data="processedData"
:props="mergedProps"
:node-key="nodeKey"
:lazy="lazy"
:load="loadNode"
:show-checkbox="showCheckbox"
:highlight-current="highlightCurrent"
:default-expand-all="defaultExpandAll"
:expand-on-click-node="expandOnClickNode"
:filter-node-method="filterNode"
@node-click="handleNodeClick"
@check-change="handleCheckChange"
>
<!-- 自定义节点内容 -->
<template #default="{ node, data }">
<span class="custom-node">
<slot name="prefix-icon" :node="node">
<el-icon v-if="showDefaultIcon"><FolderOpened /></el-icon>
</slot>
<span class="node-label">{{ node.label }}</span>
<slot name="suffix-content" :node="node" :data="data" />
</span>
</template>
</el-tree>
</div>
</template>
<script setup>
import { ref, computed, watch } from 'vue'
import { FolderOpened } from '@element-plus/icons-vue'
const props = defineProps({
// 原始数据
data: {
type: Array,
required: true
},
// 树形配置项
treeProps: {
type: Object,
default: () => ({
label: 'label',
children: 'children',
disabled: 'disabled',
isLeaf: 'isLeaf'
})
},
nodeKey: {
type: String,
default: 'id'
},
showSearch: Boolean,
showCheckbox: Boolean,
showDefaultIcon: {
type: Boolean,
default: true
},
highlightCurrent: {
type: Boolean,
default: true
},
defaultExpandAll: Boolean,
expandOnClickNode: Boolean,
lazy: Boolean,
loadFn: Function // 异步加载函数
})
const emit = defineEmits(['node-click', 'check-change', 'data-filtered'])
const filterText = ref('')
const treeRef = ref(null)
// 合并默认配置和自定义配置
const mergedProps = computed(() => ({
...props.treeProps
}))
// 数据处理(可根据需要添加转换逻辑)
const processedData = computed(() => {
// 这里可以添加数据转换逻辑
return props.data
})
// 过滤方法
const filterNode = (value, data) => {
return data[mergedProps.value.label].includes(value)
}
// 节点点击事件
const handleNodeClick = (data, node) => {
emit('node-click', { data, node })
}
// 复选框变化事件
const handleCheckChange = (data, checked, indeterminate) => {
emit('check-change', { data, checked, indeterminate })
}
// 异步加载节点
const loadNode = async (node, resolve) => {
if (typeof props.loadFn === 'function') {
const children = await props.loadFn(node)
resolve(children || [])
}
}
// 监听搜索过滤
watch(filterText, (val) => {
treeRef.value?.filter(val)
emit('data-filtered', val)
})
// 暴露方法
defineExpose({
getCheckedNodes: () => treeRef.value?.getCheckedNodes(),
setCheckedKeys: (keys) => treeRef.value?.setCheckedKeys(keys),
filter: (value) => treeRef.value?.filter(value)
})
</script>
<style scoped>
.custom-tree-container {
padding: 10px;
background: #fff;
border-radius: 4px;
}
.tree-search {
margin-bottom: 10px;
}
.custom-node {
display: flex;
align-items: center;
padding: 5px 0;
}
.node-label {
margin-left: 6px;
}
:deep(.el-tree-node__content) {
height: 36px;
}
</style>
这是我封装的一个tree组件,我该如何在其他组件中使用他