【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 typeSeledthis.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.hqwc.cn/news/512182.html

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

相关文章

ES核心概念(45-48)(56-62)(101-103)

ES集群 ES集群&#xff08;Cluster&#xff09;包含多个节点&#xff08;服务器&#xff09;&#xff0c;整体提供服务 核心概念 索引Index&#xff1a;类似于mysql中的表 映射Mapping:数据的结构信息 文档&#xff1a;相当于表中的一条记录 分片&#xff1a; 将数据分成多片…

010-原型链

原型链 1、概念2、原理3、new 操作符原理4、应用 1、概念 原型链&#xff1a;javascript的继承机制&#xff0c;是指获取JavaScript对象的属性会顺着其_proto_的指向寻找&#xff0c;直至找到Object.prototype上。 2、原理 &#x1f4a1; Tips&#xff1a;构造函数 Fn&#…

Day12-【Java SE进阶】JDK8新特性:Lambda表达式、方法引用、常见算法、正则表达式、异常

一、JDK8新特性 1.Lambda表达式 Lambda表达式是JDK 8开始新增的一种语法形式;作用:用于简化名内部类的代码写法。 注意:Lambda表达式并不是说能简化全部匿名内部类的写法&#xff0c;只能简化函数式接口的匿名内部类。 有且仅有一个抽象方法的接口。注意:将来我们见到的大部…

电商直播大屏是什么?想搞这个怎么做?

随着电商行业的快速发展&#xff0c;直播带货已成为当下最热门的市场营销方式之一。为了更好地掌握直播数据&#xff0c;为企业决策提供有力支持&#xff0c;电商直播数据大屏应运而生。 一、电商直播数据大屏概述 电商直播数据大屏是一种集成了多种数据源的大屏幕可视化展示…

C if...else 语句

一个 if 语句 后可跟一个可选的 else 语句&#xff0c;else 语句在布尔表达式为 false 时执行。 语法 C 语言中 if…else 语句的语法&#xff1a; if(boolean_expression) {/* 如果布尔表达式为真将执行的语句 */ } else {/* 如果布尔表达式为假将执行的语句 */ }如果布尔表…

主流抠图算法trimap-based/free

GitHub - JizhiziLi/matting-survey: Deep Image Matting: A Comprehensive SurveyDeep Image Matting: A Comprehensive Survey. Contribute to JizhiziLi/matting-survey development by creating an account on GitHub.https://github.com/JizhiziLi/matting-survey数据集介…

C语言文件操作,linux文件操作,文件描述符,linux下一切皆文件,缓冲区,重定向

目录 C语言文件操作 如何打开文件以及打开文件方式 读写文件 关闭文件 Linux系统下的文件操作 open 宏标志位 write&#xff0c;read&#xff0c;close&#xff0c;lseek接口 什么是当前路径&#xff1f; linux下一切皆文件 文件描述符 文件描述符排序 C语言文件操…

【更新2022】各省数字经济水平测算 原始数据+结果 2011-2022

数据说明&#xff1a;参照赵涛等&#xff08;2020&#xff09;的文章&#xff0c;利用熵值法和主成分对省市数字经济水平进行测算&#xff0c;原始数据来自第五期北大数字普惠金融指数&#xff0c;含原始数据&#xff0c;以及熵值法、主成分两种测算结果。一、数据介绍 数据名…

【EI会议征稿通知】第七届交通运输与土木建筑国际学术论坛(ISTTCA 2024)

第七届交通运输与土木建筑国际学术论坛&#xff08;ISTTCA 2024&#xff09; 2024 7th International Symposium on Traffic Transportation and Civil Architecture 交通运输是经济发展的先行官&#xff0c;而岩土是发展交通运输网络无法避开的话题。将传统的土木工程技术与先…

python爬虫之Appium 的使用

Appium 是一个跨平台移动端自动化测试工具&#xff0c;可以非常便捷地为 iOS 和 Android 平台创建自动化测试用例。它可以模拟 App 内部的各种操作&#xff0c;如点击、滑动、文本输入等&#xff0c;只要我们手工操作的动作 Appium 都可以完成。在前面我们了解过 Selenium&…

DiffusionMat:Alpha Matting as sequential refinement learning

1.introduction DiffusionMat的基本思想是未知区域的抠图可以逐步改进&#xff0c;并从每一次的迭代的反馈中受益&#xff0c;纠正和细化结果。 2.related works Segdiff、BitDiffusion、DiffusionDet、 3.Approach 通过一种新颖的校正策略将trimap引导转化为精确的alpha m…

Java实现手机库存管理

一、实验任务 编写一个程序&#xff0c;模拟库存管理系统。该系统主要包括系统首页、商品入库、商品显示和删除商品功能。每个功能的具体要求如下&#xff1a; 1.系统的首页&#xff1a;用于显示系统所有的操作&#xff0c;并且可以选择使用某一个功能。 2.商品入库功能&…