【vue/组件封装】封装一个带条件筛选的搜索框组件(多组条件思路、可多选)详细流程

引入:实现一个带有筛选功能的搜索框,封装成组件;

搜索框长这样子:
在这里插入图片描述
点击右侧筛选图标后弹出层,长这样子:
在这里插入图片描述
实际应用中有多组筛选条件,这里为了举栗子就展示一组;

预览:
请添加图片描述

实现思路

  1. css 样式大致布局;
  2. 选中和取消选中的效果、样式切换等;
  3. 多选的功能;
  4. 多组筛选条件的多选功能;

需要给父组件传递的数据有:

  • 点击搜索按钮时传【输入的内容】;
  • 点击查询按钮时传【选择的查询条件】

进一步的实现:

  • 首先写好基础的静态样式;
  • 当要开始写功能的时候,可以换成接口调用的动态数据,从父组件传入;
  • 先写单选,动态绑定 class 样式来实现选中之后的样式:
:class="{ 'seled-btn': venSeled.includes(index) }"
  • 选中后考虑还需要取消,因为条件筛选是多选的,所以是将下标保存进数组中:
if (this.typeSeled.includes(index)) {
    // 筛掉【当前选中的】和【数组中】不一致的下标,即只保存相等的
    this.typeSeled = this.typeSeled.filter(item => item != index)
} else {
    // 未选中就添加进数组中
    this.typeSeled.push(index)
}

代码:

<!-- 
    带条件筛选的搜索框组件
 -->

<template>
    <view class="container">
        <u-popup v-model="show" mode="top" border-radius="14" length="50%">
            <view class="wrap">
                <view class="wrap-top">
                    <p>类型:</p>
                    <view class="item">
                        <view v-for="(item, index) in typeList" :key="index" @click="seledBtn(index, 'type', item)"
                            class="btn sel-btn" :class="{ 'seled-btn': typeSeled.includes(index) }">{{ item }}
                        </view>
                    </view>
                </view>
            </view>
            <view class="wrap-foot" style="display: flex;">
                <u-button @click="reset">重置</u-button>
                <u-button type="primary" @click="searchRes">查询</u-button>
            </view>
        </u-popup>
        <u-search @custom="searchClick" :show-action="true" v-model="val" placeholder="请输入" shape="square"
            :border="border" :animation="false"></u-search>
        <img class="right-icon" @click="show = true" src="../../../../static/gzt/filter.png" width="18" height="18" alt="">
    </view>
</template>

<script>
export default {
    props: {
        vehList: {
            type: Array
        },
        workList: {
            type: Array
        }
    },
    data() {
        return {
            typeList: ['类型1', '类型2'],
            // 是否点击
            typeSeled: [],
            val: '',
            border: true,
            show: false
        }
    },
    methods: {
        // 点击搜索
        searchClick() {
            this.$emit('singleClick', this.val)
        },
        // 选中某一个条件
        seledBtn(index, type, itemVal) {
            // console.log('type', type);
            if (type == 'type') {
                if (this.typeSeled.includes(index)) {
                    // 筛掉【当前选中的】和【数组中】不一致的下标
                    this.typeSeled = this.typeSeled.filter(item => item != index)
                } else {
                    // 未选中就添加进数组中
                    this.typeSeled.push(index)
                }
            } 
        },
        // 点击重置
        reset() {
            this.typeSeled = []
        },
        // 点击查询
        searchRes() {
            let typeRes = []

            // 整理数据
            // typeList typeSeled
            this.typeList.forEach((item, index) => {
                this.typeSeled.forEach(item1 => {
                    if (index == item1) {
                        typeRes.push(item)
                    }
                })
            })
            // 给父组件发送选择的查询条件
            this.$emit('filterSearch', typeRes)
        }
    }
}
</script>

样式参考:

<style lang="scss">
.wrap {
    padding: 0 15px 60px 15px;

    // background-color: pink;
    .wrap-top {
        margin-top: 10px;

        >p {
            color: #4F4B46;
        }

        .item {
            display: flex;
            flex-wrap: wrap;
            margin-top: 10px;
        }

        // btn的共有样式
        .btn {
            margin-top: 5px;
            margin-right: 8px;
            width: 30%;
            text-align: center;
            padding: 5px;
            border-radius: 8px;
        }

        // 未被选中的样式
        .sel-btn {
            background-color: #F5F7F8;
            color: #717171;
            border: 1px solid #F0F0F0;

        }

        // 被选中的样式
        .seled-btn {
            background-color: #EDF5FF;
            border: 1px solid #6AA4EC;
            color: #6AA4EC;
        }
    }
}

::v-deep .u-btn--default {
    color: #b7b8b8 !important;
    border-radius: 0px;
}

.wrap-foot {
    position: fixed;
    margin-top: 5px;
    bottom: -1px;
    width: 100%;
}

::v-deep uni-button {
    width: 100%;
}

.container {
    display: flex;
    background-color: white;
    padding: 5px;
    border-radius: 8px;

    .right-icon {
        margin-top: 7px;
        margin-left: 10px;
    }
}

::v-deep .u-action-active {
    color: gray;
}

::v-deep .u-content {
    border: 1px solid #ccc !important;
}
</style>

关于有好几组筛选条件时怎么进行选择,我的方法是,在 seledBtn 函数里写一个循环,以 0-几组筛选条件的长度进行循环,最终数组只有一个,给这个数组里对应下标里进行增加或删除,下标对应的是第几组筛选条件,比如我有3组,最终数组就是:[[],[],[]] 这么一个嵌套数组;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows环境中Domain Controller (域控制器)的搭建,零基础教学详细教程

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;网络安全渗透 景天的主页&#xff1a;景天科技苑 文章目录 1.搭建域环境2.搭建过程2.1.安装域控2.2.建立域的普通用户2.3.把…

BUUCTF:[MRCTF2020]ezmisc

题目地址&#xff1a;https://buuoj.cn/challenges#[MRCTF2020]ezmisc 下载附件打开是一张照片&#xff1a; 放到kali中发现crc校验错误&#xff0c;修改照片宽高&#xff1a; 保存即可发现flag flag为&#xff1a; flag{1ts_vEryyyyyy_ez!}

为什么MySQL中多表联查效率低,连接查询实现的原理是什么?

MySQL中多表联查效率低的原因主要涉及到以下几个方面&#xff1a; 数据量大: 当多个表通过连接查询时&#xff0c;如果这些表的数据量很大&#xff0c;那么查询就需要处理更多的数据&#xff0c;这自然会降低查询效率。 连接操作复杂性: 连接查询需要对参与连接的每个表中的数…

HTTPS是什么,那些行业适合部署呢?

随着在线活动的增加&#xff0c;对您共享的关键数据的威胁已经产生了严重的后果&#xff0c;包括欺诈性金融交易、在线身份盗窃等。此外&#xff0c;随着技术使用的增加&#xff0c;网络攻击也变得更加复杂和具有挑战性。 毫无疑问&#xff0c;互联网用户的数据安全意识成倍增长…

QVector和QString互相转换

我的画图项目需要读写自定义虚线样式 {...comboBox_penStyle new QComboBox;QStringList SL_penStyle;SL_penStyle << "______" << "----------" << ".........." << "-.-.-.-.-." << "-..-..-..…

openEuler 社区 2024 年 2 月运作报告

概述 2024年2月中旬&#xff0c;OpenAtom openEuler&#xff08;简称"openEuler"&#xff09;2023 社区年报发布。这是社区开源四年来&#xff0c;在生态构建、技术创新、产业聚集、人才培养等方面发展的成果展示&#xff0c;也是社区1400多家成员单位、1.7万多名开…

前面说什么是前后端分类,那到底是怎么个分类法呢?

前后端分离是指将一个web 系统的动态内容和静态内容进行分离&#xff0c;包括其开发、部署等。 比如传统的 MVC 架构&#xff0c;HTML、JS、CSS… 等前端代码和 Java、spring、mybatis… 等后端代码是在同一个项目中进行开发、部署的。那前后端分离后&#xff0c;就可以分多个项…

深入浅出解析SSL:保障网络安全的加密技术

在数字信息时代&#xff0c;网络安全已成为人们关注的重点。为了在网络传输过程中保护数据的完整性和机密性&#xff0c;我们需要一种强大的安全协议——SSL&#xff08;安全套接层&#xff09;。今天德迅云安全就带大家来简单了解下SSL是什么&#xff0c;它的工作原理以及为何…

Java中常见延时队列的实现方案总结

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&…

Intel RealSense D435环境搭建之安装pyrealsense2

ERROR: Could not find a version that satisfies the requirement pyrealsense2 (from versions: none) pip install pyrealsense2 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com 方法一&#xff1a;升级pip python -m pip install --upgrade pip 方…

Redis第6讲——主从复制模式详解

Redis的读写性能很高&#xff0c;但在面对大规模数据和高发访问的挑战时&#xff0c;单节点的Redis可能无法满足需求&#xff0c;这就引出了Redis集群的概念。本节先介绍一下Redis高可用方案之一的主从复制模式&#xff0c;虽说现在基本不会用这种模式&#xff0c;但是无论是哨…

【VTKExamples::PolyData】第四十九期 Silhouette

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享VTK样例Silhouette,并解析接口vtkPolyDataSilhouette,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 1. Silhouett…

C语言数组全面解析:从初学到精通

数组 1. 前言2. 一维数组的创建和初始化3. 一维数组的使用4. 一维数组在内存中的存储5. 二维数组的创建和初始化6. 二维数组的使用7. 二维数组在内存中的存储8. 数组越界9. 数组作为函数参数10. 综合练习10.1 用函数初始化&#xff0c;逆置&#xff0c;打印整型数组10.2 交换两…

Python自动化测试ConfigParser模块读写配置文件

Python自动化测试ConfigParser模块读写配置文件 ConfigParser 是Python自带的模块&#xff0c; 用来读写配置文件&#xff0c; 用法及其简单。 直接上代码&#xff0c;不解释&#xff0c;不多说。 配置文件的格式是&#xff1a; []包含的叫section, section 下有optionval…

Mac Pro 突然不能双击打开文件夹

当Mac Pro 突然不能双击打开文件夹 不防右击看看这儿 有没有勾选 如果勾选就会在打开的瞬间 闪退关掉文件夹

安全SCDN详解

随着互联网发展&#xff0c;越来越多的人都会使用到网站&#xff0c;个人网站、企业网站&#xff0c;各类大大小小的网站影响到人们的生活方方面面。许多站长都有使用或是听起过CDN&#xff0c;而SCDN&#xff0c;全称为“Security Content Delivery Network”&#xff0c;即安…

【2024】vue-router和pinia的配置使用

目录 vue-routerpiniavue-routerpinia进阶用法---动态路由 有同学在项目初始化后没有下载vue-router和pinia&#xff0c;下面开始&#xff1a; vue-router npm install vue-router然后在src目录下创建文件夹router&#xff0c;以及下面的index.ts文件&#xff1a; 写进下面的…

如何选择阿里云服务器配置,过来人说说

阿里云服务器配置怎么选择&#xff1f;CPU内存、公网带宽和系统盘怎么选择&#xff1f;个人开发者或中小企业选择轻量应用服务器、ECS经济型e实例&#xff0c;企业用户选择ECS通用算力型u1云服务器、ECS计算型c7、通用型g7云服务器&#xff0c;阿里云服务器网aliyunfuwuqi.com整…

京津冀国际光伏展

京津冀国际光伏展是中国在京津冀地区举办的一项光伏展览活动。光伏&#xff0c;即太阳能光伏发电技术&#xff0c;是利用太阳能将光能转化为电能的一种可再生能源技术。光伏展旨在促进光伏产业的发展与合作&#xff0c;推动光伏技术在京津冀地区的应用和推广。 在京津冀国际光伏…

对VisionPro的认识,CogPMAlingTool模板匹配工具练习

什么是VisionPro&#xff1f; 在认识VisionPro之前我们需要先熟悉一下图片的各种格式 这里我们可以参考来自githubcurry博主的文章 图片各种格式的区别以及计算机如何存储图片 VisionPro 是由世界领先的机器视觉公司 Cognex 开发的一款专业机器视觉软件。它提供了强大的图像…