vue纯前端过滤嵌套数据,通过关键字搜索过滤嵌套数据

1.过滤效果:

2. cardList 数据源:

[
    {
        "id": 4,
        "createTime": "2024-03-28 02:47:18",
        "updateTime": "2024-03-28 02:47:18",
        "uniqueId": "test",
        "name": "测试",
        "sort": 1,
        "deletable": true,
        "enable": true,
        "modelList": [
            {
                "uniqueId": "test",
                "name": "应",
                "icon": "el-icon-question",
                "sort": 1,
                "enable": true,
                "size": 0,
                "groupId": 4,
                "createTime": "2024-03-28 02:47:37",
                "updateTime": "2024-03-28 02:47:37"
            }
        ]
    },
    {
        "id": 2,
        "createTime": "2024-03-21 00:45:43",
        "updateTime": "2024-03-21 00:45:43",
        "uniqueId": "sh_app",
        "name": "应用管理",
        "sort": 1,
        "deletable": true,
        "enable": true,
        "modelList": [
            {
                "uniqueId": "server",
                "name": "服务器",
                "icon": "el-icon-s-management",
                "sort": 1,
                "enable": true,
                "size": 3,
                "groupId": 2,
                "createTime": "2024-03-21 07:51:01",
                "updateTime": "2024-03-27 07:48:48"
            },
            {
                "uniqueId": "app",
                "name": "应用",
                "icon": "el-icon-s-promotion",
                "sort": 1,
                "enable": true,
                "size": 1,
                "groupId": 2,
                "createTime": "2024-03-21 00:46:01",
                "updateTime": "2024-03-27 07:48:58"
            }
        ]
    },
    {
        "id": 1,
        "createTime": "2024-03-20 08:10:34",
        "updateTime": "2024-03-20 08:10:34",
        "uniqueId": "default",
        "name": "未分类",
        "sort": 0,
        "deletable": false,
        "enable": true,
        "modelList": [
            {
                "uniqueId": "sdf",
                "name": "应测试",
                "icon": "el-icon-s-help",
                "sort": 1,
                "enable": true,
                "size": 0,
                "groupId": 1,
                "createTime": "2024-03-28 02:40:20",
                "updateTime": "2024-03-28 02:40:20"
            }
        ]
    }
]

3.vue组件源代码:

<template>

  <div class="content">

    <div class="subTitle">资源目录</div>

    <div class="container">

      <el-input

        style="margin-left: 10px"

        placeholder="请输入关键字"

        v-model="searchValue"

        class="input-with-select"

      >

        <el-button

          slot="append"

          icon="el-icon-search"

          @click="filterData"

        ></el-button>

      </el-input>

      <div class="cardStyle">

        <el-card class="box-card" v-for="(v, i) in cardList" :key="i">

          <div slot="header" class="clearfix">

            <span class="subName">{{ v.name }}</span>

          </div>

          <ul>

            <li

              v-for="(o, e) in v.modelList"

              :key="e"

              class="text item"

              :class="{

                active: showIndex == e && currentUniqueId == o.uniqueId,

              }"

              @click="goToPage(o)"

              @mouseenter="

                showIndex = e;

                currentUniqueId = o.uniqueId;

              "

              @mouseleave="showIndex = -1"

            >

              <span

                ><i style="color: #409eff" :class="o.icon"></i

                ><span style="margin-left: 10px">{{ o.name }}</span></span

              >

              <span class="num">{{ o.size }}</span>

            </li>

          </ul>

        </el-card>

      </div>

    </div>

  </div>

</template>

<script>

import { mapActions, mapMutations } from "vuex";

import { findAll } from "@/api/cmdb/model";

export default {

  data() {

    return {

      value: "",

      searchValue: "",

      options: [],

      cardList: [],

      showIndex: -1,

      currentUniqueId: null,

    };

  },

  watch: {},

  mounted() {

    this.getList();

  },

  methods: {

    ...mapMutations(["setMutCurrentPageTitle", "setActiveModel"]),

    goToPage(value) {

      this.$router.push({ path: "/resource/template" });

      this.setActiveModel(value);

      this.setMutCurrentPageTitle(value.name);

    },

    async getList() {

      await findAll({})

        .then((res) => {

          if (res.code == 0) {

            this.cardList = res.data;

          } else {

            res.desc && this.$message.error(res.desc);

          }

        })

        .catch((err) => {

          err.desc && this.$message.error(err.desc);

        });

    },

    // 通过关键字查询过滤嵌套数据

    async filterData() {

      // 过滤之前先请求拿到最新的嵌套数据 cardList

      await this.getList();

      const search = this.searchValue.toLowerCase().trim();

      if (!search) return this.cardList;

      let filterList = this.cardList.map((item) => {

        return {

          ...item,

          modelList: item.modelList.filter((o) => {

            return o.name.toLowerCase().includes(search);

          }),

        };

      });

      // 如果子节点数组没有就删除掉,不展示

      filterList.map((v, i) => {

        if (v.modelList.length == 0) {

          filterList.splice(i, 1);

        }

      });

      // 过滤筛选后赋值,这里会影响原数据cardList,所以过滤之前先请求,拿到最新的cardList

      this.cardList = filterList;

    },

  },

};

</script>

<style scoped lang="scss">

.content {

  .contentTop {

    margin-bottom: 20px;

    span {

      display: inline-block;

      margin-right: 20px;

    }

  }

  .subTitle {

    font-size: 18px;

    margin-left: 10px;

  }

  .container {

    padding: 30px 0;

    width: 100%;

    height: 100%;

    // background-color: #f9f9f9;

    ::v-deep .el-input-group {

      line-height: normal;

      display: inline-table;

      width: 20%;

      border-collapse: separate;

      border-spacing: 0;

    }

    .cardStyle {

      margin-top: 30px;

      display: flex;

      flex-direction: row;

      justify-content: flex-start;

      align-items: flex-start;

      flex-wrap: wrap;

      .box-card {

        width: 23%;

        margin: 10px;

        .subName {

          font-size: 16px;

          font-weight: 700;

        }

        li {

          width: 100%;

          height: 40px;

          margin: 5px 0;

          padding: 0 10px;

          display: flex;

          align-items: center;

          justify-content: space-between;

          cursor: pointer;

          .num {

            color: #ccc;

          }

          &.active {

            background: #ecf3ff;

          }

        }

      }

    }

  }

}

</style>


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/573695.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python实战之基础篇(一)

1. 注释 # coding utf-8 # 该注释放到文件第一行, 这个注释告诉python解释器该文件的编码集是UTF-82. 导入语句有三种形式 import <模块名> from <模块名> import <代码元素> from <模块名> import <代码元素> as <代码元素别名>3. 获取…

FPGA时钟资源详解(1)——时钟Buffer的选择

FPGA时钟系列文章总览&#xff1a;FPGA原理与结构&#xff08;14&#xff09;——时钟资源https://ztzhang.blog.csdn.net/article/details/132307564 目录 一、概述 二、时钟Buffer的选择 2.1 BUFG 2.2 BUFR 和 BUFIO 2.2.1 源同步接口的支持 2.2.2 扩展时钟域…

unity双层滑动实现

实现功能&#xff1a; 当滑动列表中内容处于顶端的时候&#xff0c;向上滑动优先滑动整个滑动列表&#xff0c;当滑动列表移动到设置位置&#xff0c;即设定的最高处时&#xff0c;继续移动列表内内容。向下移动亦然&#xff0c;当内容处于滑动列表顶端时&#xff0c;移动整个滑…

【面试经典150 | 动态规划】零钱兑换

文章目录 Tag题目来源解题思路方法一&#xff1a;动态规划 写在最后 Tag 【动态规划】【数组】 题目来源 322. 零钱兑换 解题思路 方法一&#xff1a;动态规划 定义状态 dp[i] 表示凑成总金额的最少硬币个数。 状态转移 从小到大枚举要凑成的金额 i&#xff0c;如果当前…

康耐视visionpro-CogAcqFifoTool工具详细说明

CogAcqFifoTool操作说明&#xff1a; ① 打开工具栏&#xff0c;双击或点击鼠标拖拽 添加CogAcqFifoTool ②.从图片采集设备/图像采集卡列表里选择对应的相机&#xff0c;视频格式选择图像格式。 Mono表示黑白图像&#xff0c;RGB表示彩色相机。点击初始化取相初始化相机。 ③…

PCL 彩色点云RGB转灰度并显示

目录 一、算法原理1、原理概述2、参考文献二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 1、原理概述 不同要素之间的灰度差异较为明显。点云灰度值与RGB属性的关系为:

宝宝洗澡水温:细心呵护,温水恰到好处

引言&#xff1a; 给新生儿洗澡是每位父母的日常之一&#xff0c;而洗澡水温的合适与否直接关系到宝宝的舒适度和安全。在本文中&#xff0c;我们将探讨宝宝洗澡水温的注意事项&#xff0c;为您提供宝宝洗澡的正确方法和技巧。 1. 温水是关键&#xff1a; 宝宝的皮肤娇嫩敏感&…

干货:教你如何在JMeter中调用Python代码N种方法!

在性能测试领域&#xff0c;JMeter已经成为测试专业人士的首选工具&#xff0c;用于模拟用户行为、测量响应时间、评估系统性能。而现在大部分接口都会涉及到验签、签名、加密等操作&#xff0c;为了满足特定需求&#xff0c;我们需要更多的灵活性&#xff0c;比如引入Python来…

【QT入门】 QTabWidget各种常见用法详解

往期回顾&#xff1a; 【QT入门】 Qt代码创建布局之分裂器布局详解-CSDN博客 【QT入门】 Qt代码创建布局之setLayout使用-CSDN博客 【QT入门】 Qt代码创建布局之多重布局变换与布局删除技巧-CSDN博客 【QT入门】 QTabWidget各种常见用法详解 一般来说&#xff0c;学一个新的控…

深兰科技陈海波:生成式AI,新一轮知识生产力革命

3月26日&#xff0c;AIoT创新技术赋能工业数字化高峰论坛在上海市宝山区临港南大数智中心隆重举行。活动吸引了诸多行业内的专家学者、企业家及金融投资机构、政府园区、用户等多位业界精英出席&#xff0c;共同探讨该领域面临的挑战与机遇&#xff0c;分享最新的科研成果和技术…

Python环境下基于原型网络的滚动轴承故障诊断方法

近年来&#xff0c;基于深度学习的故障诊断方法成为研究热点&#xff0c;它依靠海量的数据完成故障诊断模型的训练。然而&#xff0c;在实际的工业过程中&#xff0c;往往无法提供充足的故障数据样本给深度学习模型&#xff0c;在一定程度上限制了其性能。以旋转机械为例&#…

Rollup 与其它工具的集成

Rollup 与其它工具的集成 与其他 NPM 包场景实例应用插件安装命令更新src/main.js 文件结果 解决方案插件安装命令添加到配置文件中结果 rollup/plugin-commonjs 对等依赖项作用配置文件 Babel作用安装命令配置文件 与其他 NPM 包 场景 项目可能会依赖于从 NPM 安装到 node_m…