Skip to content

xtf-tree

组件说明

xtf-tree 用于展示、筛选、选择和维护层级数据,适合组织、分类和目录。支持复选级联、懒加载、编辑、增删、同级拖拽及节点插槽。


基础用法

1. 节点选择

vue
<template><xtf-tree v-model="selected" :data="data" @node-click="click" /></template>
<script>
export default {
  data() {
    return {
      selected: [],
      data: [{ id: 'a', label: '商品', children: [{ id: 'b', label: '数码' }] }]
    }
  },
  methods: {
    click(node) {
      console.log(node)
    }
  }
}
</script>

2. 复选与搜索

vue
<template>
  <xtf-tree
    v-model="selected"
    :data="data"
    checkbox
    multiple
    filterable
    default-expand-all
    @check-change="check"
  />
</template>
<script>
export default {
  data() {
    return { selected: [], data: [{ id: 1, label: '华东', children: [{ id: 2, label: '上海' }] }] }
  },
  methods: {
    check(payload) {
      console.log(payload.selectedKeys)
    }
  }
}
</script>

3. 自定义节点插槽

vue
<template>
  <xtf-tree :data="data" show-line>
    <template #default="{ node, level }">
      <view>
        <xtf-icon name="folder" size="sm" /><text>{{ level + 1 }} 级:{{ node.label }}</text></view>
</template>

  </xtf-tree>
</template>
<script>
export default {
  data() {
    return { data: [{ id: 'root', label: '仓库' }] }
  }
}
</script>

全部属性

属性类型默认值作用描述适用范围
data / modelValue / selectedKeysArray[] / undefined / []节点数据与选中 key数据、双向绑定
childrenKey / labelKey / valueKey / disabledKeyString'children'/'label'/'id'/'disabled'节点字段映射非标准数据
selectable / onlyLeafSelectable / maxSelectableBoolean/Boolean/String | Numbertrue/false/0选择能力、仅叶子、上限选择控制
multiple / checkbox / checkStrictlyBooleanfalse/false/false多选、复选、父子不关联复选树
expandAll / defaultExpandAllBooleanfalse/false全量或初始展开展开控制
defaultExpandedKeys / expandedKeysArray[]默认/受控展开 key展开控制
draggable / accordion / showLineBooleanfalse/false/false同级拖拽、手风琴、连线行为样式
childrenClass / childrenStyle / contentClass / contentStyle / checkboxClass / checkboxStyle / lineClass / lineStyleString | Array | Object | Function''节点局部样式;函数签名 (state) => value逐节点定制
filterable / filterMethodBoolean/Functionfalse/null搜索及 (node) => Boolean 过滤搜索
lazy / loadDataBoolean/Functionfalse/null懒加载及 (node) => Promise异步节点
editable / creatable / removableBooleanfalse/false/false重命名、新增、删除维护树
maxHeight / indentString | Number''/'64'最大高度与层级缩进布局
searchPlaceholder / emptyTextString''搜索和空态文案文案
expandIcon / collapseIcon / toggleIconSize / toggleIconThemeString | Number'arrow-right-s'/''/'xs'/'secondary'展开图标配置图标
itemGap / toggleGapString | Number6/8节点、开关间距密度
nodeClass / nodeStyle / toggleClass / toggleStyleString | Array | Object | Function''节点和开关样式样式定制
variant / showActiveBar / densityString/Boolean/String'default'/false/'default'default/outline/plain/branch、活动条、compact/loose视觉变体
customClass / customStyleString/String | Object''根样式样式覆盖

节点数据结构

字段类型默认值说明
idString | Number-默认节点 key
labelString''默认节点文案
childrenArray[]子节点,结构递归
disabled / lazyBooleanfalse禁用或标记懒加载

事件

事件名称回调参数说明
update:selectedKeys / update:modelValue / update:expandedKeys(keys: Array)选中或展开 key 状态同步。
node-click / node-expand / node-collapse / load(node)节点点击、展开、收起或触发懒加载时触发。
check-change({ node, checked, selectedKeys })复选状态改变。
search(keyword: String)搜索词输入或清空时触发。
node-edit({ key, label, node, data })重命名确认后触发。
node-add / node-remove变更详情新增或删除节点后触发。
node-drop({ sourceKey, targetKey, parentKey, data })同级拖拽排序完成后触发。
update:data(data: Array)编辑、新增、删除或拖拽后返回完整数据快照。

事件使用示例

vue
<template>
  <xtf-tree
    v-model="keys"
    :data="data"
    checkbox
    @check-change="onCheck"
    @update:data="data = $event"
  />
</template>
<script>
export default {
  data() {
    return { keys: [], data: [{ id: 1, label: '部门' }] }
  },
  methods: {
    onCheck(p) {
      console.log(p.node, p.selectedKeys)
    }
  }
}
</script>

插槽

插槽名作用域参数说明
默认插槽nodelevelexpandedselectedchecked替换节点内容区域。
iconnodeexpanded替换有子节点时的展开图标。
checkboxnodecheckedindeterminate替换 checkbox 为真时的复选框。

默认插槽示例

vue
<template>
  <xtf-tree v-model="selected" :data="data" checkbox @check-change="onCheck">
    <template #default="{ node, level, selected: isSelected }">
      <view class="tree-node-content">
        <text>{{ level + 1 }} 级 {{ node.label }}</text>
        <text>{{ isSelected ? '已选' : '未选' }}</text>
      </view>
    </template>
  </xtf-tree>
</template>
<script>
export default {
  data() {
    return { selected: [], data: [{ id: 'root', label: '仓库' }] }
  },
  methods: {
    onCheck(payload) {
      console.log('checked', payload.selectedKeys)
    }
  }
}
</script>

图标与复选框插槽示例

vue
<template>
  <xtf-tree :data="data" checkbox>
    <template #icon="{ expanded }">
      <xtf-icon :name="expanded ? 'folder_open' : 'folder'" size="sm" />
    </template>
    <template #checkbox="{ checked, indeterminate }">
      <xtf-tag
        size="xs"
        :theme="checked ? 'success' : 'secondary'"
        :label="indeterminate ? '部分' : checked ? '已选' : '未选'"
      />
    </template>
  </xtf-tree>
</template>
<script>
export default {
  data() {
    return { data: [{ id: 'root', label: '仓库', children: [{ id: 'stock', label: '库存' }] }] }
  }
}
</script>

主题说明

  • 选择和复选使用 var(--xtf-color-primary),文字使用 --xtf-color-text
  • 节点间距由 --xtf-tree-node-gap,连线由 --xtf-tree-rail-color 控制。
  • xtf-config-provider 或主题配置覆盖这些变量即可全局定制。

MIT Licensed