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

news2024/11/26 18:34:47

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

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

预览:
请添加图片描述

实现思路

  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组,最终数组就是:[[],[],[]] 这么一个嵌套数组;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【小白学机器学习7】相关系数R,决定系数R2和SST=SSR+SSE, 离差,偏差,方差,标准差,变异系数,标准误。

目录 1 各种数据指标&#xff0c;分类整理 1.0 关于数据/值有3种 1.1 第1类&#xff1a;描述一堆数据特征的指标&#xff1a;集中度&#xff0c;离散度&#xff0c;形状特征 1.2 第2类&#xff1a;判断预测y值和观测值差距的指标 1.3 第3类&#xff1a;描述误差的各种指标…

给定长度为n的数组a,每一次操作可以使相邻两个元素都+1或者-1,可以进行任意次操作,求最终能否使数组非递减

题目 思路&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e6 5, inf 1e18, maxm 4e4 5, …

矩阵爆破逆向-条件断点的妙用

不知道你是否使用过IDA的条件断点呢&#xff1f;在IDA进阶使用中&#xff0c;它的很多功能都有大作用&#xff0c;比如&#xff1a;ida-trace来跟踪调用流程。同时IDA的断点功能也十分强大&#xff0c;配合IDA-python的输出语句能够大杀特杀&#xff01; 那么本文就介绍一下这个…

K线实战分析系列之十八:十字线——判断行情顶部的有效信号

K线实战分析系列之十八&#xff1a;十字线——判断行情顶部的有效信号 一、十字线二、十字线总结三、三种特殊十字线四、长腿十字线五、墓碑十字线六、蜻蜓十字线七、特殊十字线总结 一、十字线 重要的反转信号 幅度较大的下跌&#xff0c;出现一根十字线&#xff0c;正好是在…

配置化脚手架cli工具开发实践

背景 我们服务于政务行业&#xff0c;正在打造一个集代码开发、数据集成、应用管理、一体化运维监控的应用支撑平台。 以此为导向&#xff0c;作为开发的第一步&#xff0c;代码工程创建应当为后续的集成、管理及监控等服务。所以区别于一般的cli工具&#xff0c;我们要做的工…

x6.js 流程图绘制笔记,常用函数

官方参考网站如下&#xff1a;https://antv-x6.gitee.io/zh/docs/tutorial/about 安装x6 输入以下命令 npm install antv/x6 --save 引用插件代码如下&#xff1a; import { Graph } from antv/x6; 创建绘制区域 this.guiX6 new Graph({container: document.querySelect…

相机恢复,这几个方法很重要!

“我的相机用了才不到一年&#xff0c;现在不知道是什么原因&#xff0c;有一些拍摄的图片找不到了&#xff0c;有什么方法可以恢复丢失的照片吗&#xff1f;” 对于热爱记录生活的用户来说&#xff0c;相机出现问题或相机数据丢失&#xff0c;都是一件很让人难过的事情。 在使…

文件上传{session文件包含以及条件竞争、图片文件渲染绕过(gif、png、jpg)}

session文件包含以及条件竞争 条件&#xff1a; 知道session文件存储在哪里 一般的默认位置&#xff1a; /var/lib/php/sess_PHPSESSID /var/lib/php/sessions/sess_PHPSESSID /tmp/sess_PHPSESSID /tmp/sessions/sess_PHPSESSID ####在没做过设置的情况下一般都是存储在/var…

基于Harris角点的室内三维全景图拼接算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1Harris角点检测原理 4.2 Harris响应函数 4.3 角点检测与筛选 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 dirs datasheet/;% 定义…

(十三)上市企业实施IPD成功案例分享之——杜邦

在化工行业&#xff0c;说起杜邦公司&#xff0c;可谓是“顶流”企业。作为一家有着200多年历史&#xff0c;历经了三个世纪的化工巨头&#xff0c;杜邦企业的发展史&#xff0c;就是化学工业&#xff0c;乃至整个科技水平的进步史。从1802年杜邦创立时主营的火药&#xff0c;到…

Redis 缓存机制如何提高应用程序的性能?

在数字时代&#xff0c;一拍脑门儿我们就能感觉到信息的海量和处理速度的迫切。不管是刷个微博、下个单&#xff0c;还是玩个游戏&#xff0c;我们都希望能快上加快&#xff0c;一点不拖泥带水。这时候&#xff0c;缓存技术就扮演了个大英雄的角色&#xff0c;它能让数据存取的…

Windows安装Go语言及VScode配置

最近搞自己的网站时突然想起来很多上学时的事&#xff0c;那会美国总统还是奥巴马&#xff0c;网页课教的是DreamWeaver跟Photoshop&#xff0c;其他语言像PHP、Java8、Python都有学一点&#xff0c;讲究一个所见即所得。虽然是信管专业那时和斌桑班长对新语言很感兴趣&#xf…

LC打怪录 希尔排序Shell sort 912.排序数组

Theory 希尔排序本质上是对插入排序的一种优化&#xff0c;它利用了插入排序的简单&#xff0c;又克服了插入排序每次只交换相邻两个元素的缺点。它的基本思想是&#xff1a; 将待排序数组按照一定的间隔分为多个子数组&#xff0c;每组分别进行插入排序。这里按照间隔分组指…

第二证券|中证1000认沽期权是什么?怎么买?

中证1000指数期权是以中证1000指数为标的资产的衍生品&#xff0c;其间中证1000认沽期权是指期权买方有权在约好的时刻以约好的价格将必定数量的标的资产卖给期权卖方的中证1000指数期权合约。 个人投资者想要生意认沽期权&#xff0c;需求去证券公司开通期权账户&#xff0c;…

阿里云2核4G服务器支持多少人同时在线?

2核4G服务器支持多少人在线&#xff1f;阿里云服务器网账号下的2核4G服务器支持20人同时在线访问&#xff0c;然而应用不同、类型不同、程序效率不同实际并发数也不同&#xff0c;2核4G服务器的在线访问人数取决于多个变量因素&#xff1a; 2核4G&#xff1a;2核CPU和4G内存对…

1.2_1 分层结构、协议、接口和服务

1.2_1 分层结构、协议、接口和服务 &#xff08;一&#xff09;为什么要分层&#xff1f; 主机A如果想要向主机B发送文件&#xff0c;则一定要经过中间的一些介质、链路。 发送文件前要完成的工作&#xff1a; 1.发起通信的计算机必须将数据通信的通路进行激活。 所谓的激活&a…

【码银送书第十三期】《ChatGPT原理与架构》

OpenAI 在 2022 年 11 月推出了人工智能聊天应用—ChatGPT。它具有广泛的应用场景&#xff0c;在多项专业和学术基准测试中表现出的智力水平&#xff0c;不仅接近甚至有时超越了人类的平均水平。这使得 ChatGPT 在推出之初就受到广大用户的欢迎&#xff0c;被科技界誉为人工智能…

gofly接口入参验证使用介绍

接口传入的参数做相关性质验证是开发中较为常用&#xff0c;gofly框架内置校验工具&#xff0c;提供开发效率&#xff0c;开发接口简单调用即可实现验证&#xff0c;下面介绍gofly框架数据验证设计思路及使用方法。 gofly框架提供了功能强大、使用便捷、灵活易扩展的数据/表单…

【unity】shader优化总结-转载

分为三个部分&#xff1a;Unity官方文档&#xff0c;GDC&#xff0c;个人经验。 Unity Manual 1.计算量优化。着色器进行的计算和处理越多&#xff0c;对性能的影响越大。针对不影响最终效果但依然进行计算的无效代码&#xff0c;进行移除操作。计算的频率也会影响游戏的性能…

增肌_锻炼

目录 练第一步 有氧运动关节活动度 第二步 脊柱侧弯吃 练 https://www.bilibili.com/video/BV14v4y1G7A3 第一步 有氧运动 有氧运动锻炼心肺 最大心率保持在50% - 60% 关节活动度 髋关节活动 亚足背屈   绕肩&#xff0c;肩环绕肩   第二步 高频的中等强度&#xf…