作者:李明骏 历史版本:1 最后编辑:李明骏 更新时间:2024-09-11 09:48
编写版本:v1.2.1
适用版本:v1.2.0+
前置条件:使用的工程需在 Webpack5 版本以上,并使用模块联邦(ModuleFederationPlugin)接入 ui-base-core 项目提供的共享组件
共享组件-树形列表
一、 效果图
二、 组件路径
baseCore/core-tree.vue
源码:ui-base-core/src/components/core-tree/index.vue
三、 使用举例
template
<template>
<Tree
:data="treeData"
title="主题分类"
placeholder="输入名称检索"
:is-search="true"
:parent-id="treeParentId"
:expand-parent="true"
:default-tree-props="defaultTreeProps"
:default-expanded-keys="defaultExpandedKeys"
:lazy="true"
:load-lazy-data="loadLazyData"
@search="handleTreeSearch"
@refresh="handleTreeSearch"
@node-click="handleTreeNodeClick"
@node-clickMenu="handleTreeNodeMenuClick"
>
<template #nodeLabel="{ data }">
<!-- 自定义文本 -->
</template>
<template #nodeIcon="{ node, data }">
<!-- 自定义图标 -->
</template>
</Tree>
</template>
script
<script setup>
import { ref } from 'vue'
import TreeUtils from '@/utils/tree'
import Utils from '@/utils/util'
import ActionUtils from '@/utils/action'
import Tree from 'baseCore/core-tree.vue'
const treeLoading = ref(false)
const treeData = ref([])
const treeParentId = ref('0')
const searchValue = ref('')
const defaultExpandedKeys = ref([])
const defaultTreeProps = {
children: 'children',
label: 'typeName',
class: 'data-tree-node',
nodeMenu: 'nodeMenu',
// 判断是否是叶子节点
isLeaf: (d) => d.leaf
}
// 加载数据主方法
const loadTreeData = (id, resolve) => {
treeLoading.value = true
const params = ActionUtils.formatParams({
name: searchValue.value,
parentId: id
})
findTree(params)
.then((data) => {
treeLoading.value = false
// 设置节点菜单
data?.forEach((item) => {
item[defaultTreeProps.nodeMenu] = [
{
key: 'preview',
label: '总览'
},
{
key: 'add',
label: '新增'
}
]
})
resolve(data)
})
.catch(() => {
treeLoading.value = false
resolve([])
})
}
// 转换树形方法
const toTree = (data) => {
return TreeUtils.transformToTreeFormat(data, {
idKey: 'id',
pIdKey: 'parentId',
childrenKey: 'children'
})
}
// 懒加载数据方法
const loadLazyData = (node, resolve) => {
if (searchValue.value) {
return resolve(node.data?.children || [])
}
const isRoot = node.level === 0
if (isRoot) {
return resolve(node.data)
}
if (node.level === 1) {
return resolve(node.data?.children || [])
}
loadTreeData(node.data.id, (data) => {
if (!data) {
resolve([])
return
}
const treeData = Utils.isNotEmpty(data) ? toTree(data) : []
resolve(treeData)
})
}
// 初始化数据
const initData = () => {
defaultExpandedKeys.value = []
loadTreeData(null, (data) => {
const d = Utils.isNotEmpty(data) ? toTree(data) : []
treeData.value = d
treeParentId.value = !!searchValue.value && d?.length ? d[0].id : '0'
if (searchValue.value) {
defaultExpandedKeys.value = data.map(item => item.id)
}
})
}
// 树形搜索事件
const handleTreeSearch = (val) => {
searchValue.value = val
initData()
}
// 节点点击事件
const handleTreeNodeClick = (data) => {
}
// 节点右键菜单处理
const handleTreeNodeMenuClick = (key, data) => {
}
</script>
四、 组件API
属性
属性名 | 类型 | 默认值 | 描述 |
---|---|---|---|
data | Object | {} | 树的数据 |
title | String | - | 树组件的标题 |
parentId | String | 0 | 父节点ID |
treeType | String | - | 树的类型 |
isTitle | Boolean | true |
是否显示标题栏 |
isSearch | Boolean | false |
是否显示搜索框 |
placeholder | String | 输入文字检索 | 搜索框的占位符 |
defaultExpandAll | Boolean | false | 是否默认展开所有节点 |
defaultExpandedKeys | Array | [] | 默认展开的节点的keys |
defaultCheckedKeys | Array | [] | 默认选中的节点的keys |
expandOnClickNode | Boolean | false |
点击节点时是否展开节点 |
expandParent | Boolean | false |
是否展开父节点 |
defaultTreeProps | Object | - | 树的默认属性 |
lazy | Boolean | false |
是否懒加载 |
loadLazyData | Function | - | 加载懒加载数据的方法 |
nodeKey | String | id | 节点的唯一标识符 |
showCheckbox | Boolean | false |
是否显示复选框 |
highlightCurrent | Boolean | false |
是否高亮当前节点 |
事件
事件名 | 说明 | 返回值 |
---|---|---|
search | 搜索事件 | 搜索关键词 |
node-click | 节点点击事件 | 节点数据 |
node-check | 节点复选框状态改变事件 | 节点数据, 是否选中 |
node-click-menu | 节点右键菜单点击事件 | 节点右键菜单命令, 节点数据 |
refresh | 刷新事件 | - |
插槽
插槽名 | 说明 |
---|---|
nodeIcon | 自定义节点图标插槽 |
nodeLabel | 自定义节点标签插槽 |