目录列表搜索功能

 

搜索到相应的目录展开并选中,搜索栏为空则清空目录置为原始状态

1.修改原有的树标签

<a-directory-tree
          v-model:expandedKeys="expandedKeys"
          v-model:selectedKeys="selectedKeys"
          multiple
          :tree-data="treeData"
          style="background-color: #e5e5e5"
          @rightClick="onRightClick"
          @select="handleDirectoryClick"
          :auto-expand-parent="autoExpandParent"
        >
        </a-directory-tree>

其中@select="handleDirectoryClick"是根据目录信息动态获取表格中的对应数据,可自行添加 

2.添加搜索逻辑

// 在函数外部声明 enumOptions
const enumOptions = ref([]);

// 处理搜索事件
const autoExpandParent = ref<boolean>(true);
watch(searchValue, async value => {
  try {
    // 调用接口搜索目录数据
    const response = await selectDirectoryByName({ name: value.trim() });
    // 假设搜索接口返回的是一个数组,表示搜索结果
    const directories = response.data.data;
    if (directories && directories.length > 0) {
      // 将搜索结果转换为树形结构
      const treeData = transformToTreeData(directories);
      const selected = [];
      treeData.forEach((item: any) => selected.push(item.key))
      // 获取需要展开的节点的 keys 和需要选中的节点的 keys
      const expanded = getKeysForSearchResult(treeData);
      // 更新展开和选中的节点
      expandedKeys.value = expanded;
      selectedKeys.value = selected;
      searchValue.value = value;
      autoExpandParent.value = true;
      enumOptions.value = treeData;
    } else {
      // 如果未搜索到目录,则清空展开和选中的节点
      expandedKeys.value = [];
      selectedKeys.value = [];
      // 清空树形目录数据
      enumOptions.value = [];
    }
  } catch (error) {
    console.error('搜索目录失败:', error);
  }
  
});

// 将搜索结果转换为树形结构
const transformToTreeData = (directories) => {
  return directories.map((dir) => ({
    title: dir.directoryName,
    key: String(dir.id),
    children: dir.children ? 
    (dir.children) : []
  }));
};

// 获取需要展开和选中的节点的 keys
const getKeysForSearchResult = (treeData) => {
  const expanded = [];
  
  // 递归函数,用于从当前节点向上查找并添加展开和选中的节点 keys
  const findAndAddKeys = (node) => {
    if (node) {
      expanded.push(node.key);
      // 如果当前节点有父节点,继续向上查找并添加展开和选中的节点 keys
      if (node.parent) {
        findAndAddKeys(node.parent);
      }
    }
  };
  // 遍历树形结构,查找搜索结果的节点并添加展开和选中的节点 keys
  treeData.forEach((node) => {
    findAndAddKeys(node)
  });

  return expanded;
};

 可查阅antdv官网查阅更多详情 Ant Design Vue — An enterprise-class UI components based on Ant Design and Vue.js

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值