vue3 ant-design-vue a-tree-select slots 用法

<template>
  <a-tree-select
    v-model:value="value"
    style="width: 100%"
    :dropdown-style="{ maxHeight: '400px', overflow: 'auto' }"
    :tree-data="treeData"
    placeholder="Please select"
    tree-default-expand-all
  >
    <template #title="{ key, value }">
      <span style="color: #08c" v-if="key === '0-0-1'">Child Node1 {{ value }}</span>
    </template>
  </a-tree-select>
</template>

const treeData: TreeDataItem[] = [
  {
    title: 'Node1',
    value: '0-0',
    key: '0-0',
    children: [
      {
        value: '0-0-1',
        key: '0-0-1',
        slots: {
          title: 'title',
        },
      },
      {
        title: 'Child Node2',
        value: '0-0-2',
        key: '0-0-2',
      },
    ],
  },
  {
    title: 'Node2',
    value: '0-1',
    key: '0-1',
  },
];

可能人就是这么设计的吧,反正是我研究了2个多小时

  <template #title="{ key, value }">
      <span style="color: #08c" v-if="key === '0-0-1'">Child Node1 {{ value }}</span>
    </template>

如果你想用 title 插槽,那你的数据里就不能有这个title 这个值,否则无效

### 配置 `a-tree-select` 显示完整路径 为了使 Ant Design Vue 的 `a-tree-select` 组件能够显示完整的路径而不是仅当前选中的节点标签,可以通过自定义渲染函数来实现这一需求。具体来说,在模板部分通过插槽(slot)机制重写默认的选择项展示逻辑。 对于给定的 HTML 和 JavaScript 结构: ```html <a-tree-select v-model:value="value" :tree-data="treedata" > </a-tree-select> ``` 以及对应的 JS 定义如下所示[^1]: ```javascript const value = ref(); const treedata = ref([ { title: &#39;Node1&#39;, value: &#39;0-0&#39;, key: &#39;0-0&#39;, children: [ {title: &#39;Child Node1&#39;, value: &#39;0-0-0&#39;, key: &#39;0-0-0&#39;}, {title: &#39;Child Node2&#39;, value: &#39;0-0-1&#39;, key: &#39;0-0-1&#39;} ] } ]); ``` 要让选择器显示出整个路径,则可以在 `<template>` 中加入具名 slot 来覆盖默认行为,并利用递归方法构建完整的路径字符串。下面是一个简单的例子说明如何做到这一点: ```html <template> <div id="app"> <!-- 使用 scoped slots 自定义选项 --> <a-tree-select show-search style="width: 100%" placeholder="Please select" allow-clear tree-default-expand-all v-model:value="value" :dropdown-style="{ maxHeight: &#39;400px&#39;, overflow: &#39;auto&#39; }" :tree-data="treedata" > <template #default="{ node, dataRef }"> {{ getFullPath(dataRef) }} </template> </a-tree-select> Selected Value: {{ displayValue }} </div> </template> <script setup lang="ts"> import { computed, ref } from "vue"; // 假设这是从服务器获取到的数据... const treedata = ref([...]); let value = ref<string | null>(null); function findParentTitles(nodeId: string): Array<{ title?: string }> { let result = []; function traverse(nodes: any[], currentPath: Array<{ title?: string }>) { nodes.forEach((node) => { if (node.children && node.children.length > 0) { const newPath = [...currentPath]; newPath.push({ title: node.title }); if (node.key === nodeId || node.value === nodeId) { result = newPath; return; } traverse(node.children, newPath); } else if ((node.key === nodeId || node.value === nodeId)) { result = [...currentPath, { title: node.title }]; } }); } traverse(treedata.value, []); return result; } const displayValue = computed(() => value.value ? getFullPath(findLastSelectedNode(value.value)) : &#39;&#39; ) function getFullPath(nodeData: any[]): string { return nodeData.map(item => item.title).join(&#39; / &#39;); } </script> ``` 上述代码片段展示了如何创建一个计算属性 `displayValue` 来动态更新所选项目的完整路径表示形式。同时实现了辅助函数 `findParentTitles()` 及其内部使用的遍历算法用于收集从根节点至目标节点之间的所有祖先节点的信息;最后由 `getFullPath()` 函数负责将这些信息转换为易于阅读的形式并返回。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值