当前位置: 首页 > article >正文

elment-ui的折叠tree表单实现纯前端搜索,展开收起功能

好久没更新博客了~
记录一下本次做的一个很扯的需求
在这里插入图片描述
纯前端去实现这个查询的功能,后台返回的是个数组对象,前端要给他包装成树结构先展示
之后参考代码路径src\views\goods\category\index.vue
需求描述:
搜索输入任何一个关键字,都会展开他的父级,两个栏目都包含了,那么两个父级都展开
先模拟数据,上代码:

categoryList=[
    {
        categoryName:'测试1',
        children:[
            {
                categoryName:'haha1',
                children:[

                ]
            },
        ]
    },{
        categoryName:'测试2',
        children:[
            {
                categoryName:'haha2',
                children:[

                ]
            },
        ]
    },{
        categoryName:'钦佩',
        children:[
            {
                categoryName:'haha2',
                children:[

                ]
            },
        ]
    }
]
<el-table
      v-loading="loading"
      :data="categoryList"
      row-key="categoryId"
      stripe
      :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
      :expand-row-keys="expandedCategoryIds"
    >
      <el-table-column label="分类名称" prop="categoryName" />
      <el-table-column label="分类等级" prop="level" />
      <el-table-column label="状态" prop="status" :formatter="statusFormat" />
      <el-table-column label="关键字" prop="keywords" />
      <el-table-column label="排序" prop="sortNum" />
      <el-table-column label="创建时间" prop="createTime" width="180" />
      <el-table-column label="操作" min-width="120">
      </el-table-column>
    </el-table>

根据categoryName进行前端模糊搜索,会递归categoryList 里面所有的值,包括children,children的不固定多少级,
比如我所有一个haha,不管是哪一级,都会把,包含这个haha的都展开,别的项目也不会隐藏

<el-input
v-model=“searchText”
placeholder=“请输入搜索关键词”
class=“inpClass”
clearable
@keydown.enter.native=“onSearchChange”

  data() {
    return {
      searchText: "",
        }
      }
    // 处理搜索
    onSearchChange() {
      const expandIds = new Set();
      // 递归搜索函数
      const searchInCategory = (categories, parentIds = []) => {
        if (!categories) return false;

        let hasMatch = false;

        for (const category of categories) {
          const currentIds = [...parentIds, category.categoryId];

          // 检查当前项是否匹配
          const isMatch = category.categoryName
            .toLowerCase()
            .includes(this.searchText.toLowerCase());

          // 递归检查子项
          const hasChildMatch = searchInCategory(category.children, currentIds);

          // 如果当前项或子项匹配,添加所有父级ID到展开集合
          if (isMatch || hasChildMatch) {
            currentIds.forEach((id) => expandIds.add(id));
            hasMatch = true;
          }
        }

        return hasMatch;
      };

      if (this.searchText) {
        searchInCategory(this.categoryList);
        this.expandedCategoryIds = Array.from(expandIds).map(String);
      } else {
        // 确保设置一个新的空数组
        this.expandedCategoryIds = [];
        // 2. 确保在DOM更新后执行收起操作
        this.$nextTick(() => {
          // 3. 遍历所有数据强制收起
          const closeRows = (data) => {
            data.forEach((row) => {
              if (this.$refs.tableRef) {
                this.$refs.tableRef.toggleRowExpansion(row, false);
              }
              if (row.children && row.children.length) {
                closeRows(row.children);
              }
            });
          };
          closeRows(this.categoryList);
        });
      }
    },

在获取列表数据的时候也进行初始化数据

    /** 查询商品分类列表 */
    getList() {
      this.loading = true;
      listCategory(this.queryParams).then((response) => {
        if (response.data) {
          this.categoryList = this.handleTree(response.data, "categoryId");
          this.expandedCategoryIds = [];
          // 2. 确保在DOM更新后执行收起操作
          this.$nextTick(() => {
            // 3. 遍历所有数据强制收起
            const closeRows = (data) => {
              data.forEach((row) => {
                if (this.$refs.tableRef) {
                  this.$refs.tableRef.toggleRowExpansion(row, false);
                }
                if (row.children && row.children.length) {
                  closeRows(row.children);
                }
              });
            };
            closeRows(this.categoryList);
          });
        }
        this.loading = false;
      });
    },

这样就实现纯前端去模拟搜索的效果

注意,后来又遇到一个问题:

<el-table
      v-loading="loading"
      :data="categoryList"
      row-key="categoryId"
      stripe
      :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
      :expand-row-keys="expandedCategoryIds"
    >
      categoryList 的树形结构里面有categoryId,我直接设置下面这个,也不会展开
    expandedCategoryIds: [758, 753, 748]

因为element-ui会把那个数值自动转换为String一直匹配不上…,后来转值了解决


http://www.kler.cn/a/402443.html

相关文章:

  • Excel如何批量导入图片
  • 数据库的联合查询
  • 在vue中,根据后端接口返回的文件流实现word文件弹窗预览
  • 【大数据学习 | Spark-Core】广播变量和累加器
  • 微机原理与接口技术——可编定时器,计数芯片8253.8254
  • 文件操作详解(1)
  • 【C++习题】5.验证一个字符串是否是回文
  • 详解模版类pair
  • go channel中的 close注意事项 range取数据
  • MySQL数据库4——数据库设计
  • 基于YOLOv8深度学习的医学影像阿尔兹海默症检测诊断系统研究与实现(PyQt5界面+数据集+训练代码)
  • 【设计模式】行为型模式(四):备忘录模式、中介者模式
  • javaweb学习——Day2
  • 原生鸿蒙中实现RN热加载的详细步骤
  • gin源码阅读(2)请求体中的JSON参数是如何解析的?
  • 科技赋能-JAVA发票查验接口、智能、高效的代名词
  • 【springboot】配置文件加载顺序
  • 「四」体验HarmonyOS端云一体化开发模板——工程目录结构与云侧工程一键部署AGC云端
  • 【D01】网络安全概论
  • mySql修改时区完整教程
  • 实战精选|如何使用 OpenVINO™ 在 ElectronJS 中创建桌面应用程序
  • Stable Diffusion核心网络结构——CLIP Text Encoder
  • 修改gitee提交时用户名密码输错导致提交失败的解决方法
  • 第14章 Nginx WEB服务器企业实战
  • 详细描述一下Elasticsearch搜索的过程?
  • 计算机网络安全 —— 对称加密算法 DES (一)