作者:李明骏  历史版本:1  最后编辑:李明骏  更新时间:2024-07-19 16:43

编写版本: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 自定义节点标签插槽