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

Vue3中搜索表单的二次封装

最近使用Vue3+ElementPlus开发项目,从整体上构思组件的封装。能写成组件的内容都进行封装,方便多个地方使用。
受AntDesign的启发,在项目中有搜索表单+table+分页的地方可以封装为一个组件,只需要对组件传入table的列,组成一个配置项,通过配置可以显示搜索表单、table项的内容展示等等。
那么在使用ElemenPlus开发时,是没有这样的组件可以使用的。又一想项目中好多个地方都有搜索表单+Table的形式,那不如直接封装个搜索表单,这样就省去了一遍一遍的表单的重复编写。封装好的组件只需要传入进入配置内容即可实现搜索的效果。

实现思路:

  1. 搜索表单无非就是文本框、选择框、时间选择、时间范围选择、数字框,通过配置项里传入type即可判断展示哪种类型的form-item。
  2. 数值绑定,v-model与传入项的匹配,在配置项中传入prop,然后在子组件中创建form响应式对象。
  3. 数据初始值、选项列表等等都通过配置项传入。
  4. 搜索表单的搜索与重置按钮,提交emit事件即可。

首先:创建SearchForm.vue组件

该组件实现了输入框、选择框、单日期、双日期(一般搜索表单也就这些,如果还有其他的类型,读者可以自己添加)。

<script setup>import { reactive, onMounted } from "vue"import DateRangePicker from '@/components/DateRangePicker/index.vue'const props = defineProps({itemList: Array})const emit = defineEmits(['search', 'reset'])let form = reactive({})onMounted(() => {props.itemList.map(item => {if(item.type === 'dateRange') {form[item.start] = ''form[item.end] = ''}else {form[item.prop] = item.initValue ? item.initValue : ''}})})
</script><template><el-form :model="form" inline label-width="120px"><template v-for="(item, index) in props.itemList" :key="index"><el-form-item:label="item.label":prop="item.prop"><el-select v-if="item.type === 'select'" v-model="form[item.prop]" placeholder="请选择" clearable><el-option v-for="i in item.list" :key="i.value" :label="i.label" :value="i.value"/></el-select><el-date-picker v-if="item.type === 'date'" :type="item.dateType" v-model="form[item.prop]" placeholder="请选择" clearable/><date-range-pickerv-if="item.type === 'dateRange'"v-model:start="form[item.start]"v-model:end="form[item.end]"/><el-input-number v-if="item.type === 'number'" v-model="form[item.prop]" placeholder="请输入" clearable/><el-input v-if="item.type === 'input'" v-model="form[item.prop]" placeholder="请输入" clearable/></el-form-item></template><el-form-item><el-button @click="emit('search', form)" type="primary" icon="Search">查询</el-button><el-button @click="emit('reset')" type="primary" plain icon="Refresh">重置</el-button></el-form-item></el-form>
</template>

其次:DateRangePicker组件

这个组件是用来实现选择范围日期的,因为范围日期返回的是一个数组,如果不进行封装处理一下的话,在项目中每写一个该组件都会要写change事件来处理数据值,还挺麻烦。封装之后,只需要将对应的model传给该组件即可实现双向绑定。

<script setup>
import { ref } from "vue";
const emit = defineEmits(['update:start', 'update:end'])
const props = defineProps({start: {type: String,required: true},end: {type: String,required: true},type: {default: 'daterange'  // daterange、datetimerange、monthrange},format: {default: 'YYYY-MM-DD'},valueFormat: {default: 'YYYY-MM-DD HH:mm:ss'}
})
let dateRange = ref([])const dateChange = (e) => {emit('update:start', e ? e[0] : '')emit('update:end', e ? e[1] : '')
}
</script><template><el-date-picker v-model="dateRange":type="props.type":format="props.format":value-format="props.valueFormat"start-placeholder="开始日期"end-placeholder="结束日期"@change="dateChange"/>
</template>

最后一步:使用SearchForm组件

经过前两步的封装之后,在使用的SearchForm组件时,简直是爽的不要不要的。看示例:

<script setup>import { reactive, ref } from 'vue'import SearchForm from '@/components/SearchForm/index.vue'import ProListItem from '@/views/project/components/ProListItem.vue'import { projectList } from '@/api/project';const searchFormList = [{label: '项目名称', prop: 'name', type: 'input'},{label: '项目编码', prop: 'code', type: 'input'},{label: '项目描述', prop: 'desc', type: 'select', list: [{label: '未开始', value: 1}, {label: '已开始', value: 2}]},{label: '创建日期', type: 'dateRange', start: 'startTime', end: 'endTime'}]const dataSource = ref([])const queryForm = ref()const pagination = reactive({pageNum: 1,pageSize: 10,total: 0})const search = (form) => {console.log(form);queryForm.value = formqueryProject()}const queryProject = () => {projectList({...queryForm.value,pageNum: pagination.pageNum,pageSize: pagination.pageSize}).then((result) => {dataSource.value = result.data.listdata.total = result.data.total}).catch((err) => {});}
</script>
<template><search-form :item-list="searchFormList"@search="search"/><pro-list-item :data="dataSource"/>
</template>

啥也不说了,直接看示例,用起来多方便!!!只要项目中有要写搜索表单的地方,直接引入SearchForm组件,配置一下itemList即可实现完整功能!学会了的小伙伴赶紧去用起来吧。

相关文章:

Vue3中搜索表单的二次封装

最近使用Vue3ElementPlus开发项目&#xff0c;从整体上构思组件的封装。能写成组件的内容都进行封装&#xff0c;方便多个地方使用。 受AntDesign的启发&#xff0c;在项目中有搜索表单table分页的地方可以封装为一个组件&#xff0c;只需要对组件传入table的列&#xff0c;组成…...

百度23Q2财报最新发布:营收利润加速增长,AI+生态战略渐显规模

百度集团-SW(9888.HK)Q2财报已于2023/08/22(美东)盘前发布&#xff0c;二季度百度集团整体收入实现341亿元&#xff0c;同比增长15%;归属百度的净利润(non-GAAP)达到80亿元&#xff0c;同比增长44%。营收和利润双双实现大幅增长&#xff0c;超市场预期。其中&#xff0c;百度核…...

一个pdf文件分割成两个

# -- coding: utf-8 --** import PyPDF2 # 打开原始PDF文件 # with open(zhongguojinxiandaishi.pdf, rb) as pdf_file: # pdf_reader PyPDF2.PdfReader(pdf_file) # num_pages len(pdf_reader.pages) # # # 确定分割点&#xff08;例如&#xff0c;将页面一分为二&#xff0…...

Android 保存图片

这个主要讲的InputStream去保存。 如果需要BItmap与InputStream相互转换可以参考 Android Bitmap、InputStream、Drawable、byte[]、Base64之间的转换关系 保存图片我们需要考虑系统版本&#xff0c;Q前后还是不一样的。 /*** 保存图片* param context 上下文* param inputS…...

Android相机-架构

引言&#xff1a; 主要是针对CameraAPI v2 HAL3的架构对Android相机系统进行梳理。 相机架构 App和FrameWork Camera API v2位于&#xff1a; packages/apps/Camer2 frameworks/ex/camera2 应用框架级别&#xff0c;使用Camera2 API与相机的硬件进行交互。通过调用Binder接口…...

从C语言到C++_33(C++11_上)initializer_list+右值引用+完美转发+移动构造/赋值

目录 1. 列表初始化initializer_list 2. 前面提到的一些知识点 2.1 小语法 2.2 STL中的一些变化 3. 右值和右值引用 3.1 右值和右值引用概念 3.2 右值引用类型的左值属性 3.3 左值引用与右值引用比较 3.4 右值引用的使用场景 3.4.1 左值引用的功能和短板 3.4.2 移动…...

如何在Linux系统中处理PDF文件?

如何在Linux系统中处理PDF文件&#xff1f; 1.查看PDF文档2.合并PDF文档3.压缩PDF文档4.提取PDF文本 PDF文件是一种特殊的文件格式&#xff0c;它可以在不同的操作系统中实现跨平台的文件传输和共享。Linux系统作为一种自由开放的操作系统&#xff0c;拥有丰富的PDF文件处理工具…...

SpringBoot实现热部署/加载

在我们修改完项目代码后希望不用重启服务器就能把项目代码部署到服务器中(也就是说修改完项目代码后不用重启服务器修改后的项目代码就能生效)。 一、实现devtools原理 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-…...

我是如何使用Spring Retry减少1000 行代码

使用 Spring Retry 重构代码的综合指南。 问题介绍 在我的日常工作中&#xff0c;我主要负责开发一个庞大的金融应用程序。当客户发送请求时&#xff0c;我们使用他们的用户 ID 从第三方服务获取他们的帐户信息&#xff0c;保存交易并更新缓存中的详细信息。尽管整个流程看起来…...

ARM开发(stm32 cortex-A7核IIC实验)

1.实验目标&#xff1a;采集温湿度传感器值&#xff1b; 2.分析框图&#xff08;模拟IIC控制器&#xff09;&#xff1b; 3.代码&#xff1b; ---iic.h封装时序协议头文件--- #ifndef __IIC_H__ #define __IIC_H__ #include "stm32mp1xx_gpio.h" #include "st…...

「Java」《Java集合框架详解:掌握常用集合类,提升开发效率》

Java集合框架详解&#xff1a;掌握常用集合类&#xff0c;提升开发效率 摘要&#xff1a;一. 引言二. 集合框架概述三. 集合接口详解四. 集合类的选择五. 泛型和类型安全六. 集合的线程安全七. 高级集合类和算法八、Java集合实践操作示例1. 创建和初始化集合&#xff1a;2. 遍历…...

游戏出海需知:Admob游戏广告变现策略

越来越多的出海游戏公司更加重视应用内的广告变现&#xff0c;而 AdMob因为其提供的丰富的广告资源&#xff0c;稳定平台支持&#xff0c;被广泛接入采用。 Admob推出的广告变现策略包括bidding、插页式激励视频、开屏广告、各种细分功能的报告等等。 一、Bidding 竞价策略 …...

【linux】NFS调试总结

文章目录 00. ENV10. 简述20. 下载、安装、配置30. 使用1. 从uboot中设置NFS启动文件系统2. 调试 80. 问题1. NFS版本不匹配问题 90. 附件91. 服务端NFS配置项简述 00. ENV ubuntn1804 10. 简述 百度百科&#xff1a;https://baike.baidu.com/item/%E7%BD%91%E7%BB%9C%E6%96%87…...

wireshark进行网络监听

一、实验目的&#xff1a; 1&#xff09;掌握使用CCProxy配置代理服务器&#xff1b; 2&#xff09;掌握使用wireshark抓取数据包&#xff1b; 3&#xff09;能够对数据包进行简单的分析。 二、预备知识&#xff1a; 包括监听模式、代理服务器、中间人攻击等知识点&#xf…...

时间复杂度

一、时间复杂度 时间复杂度是计算机科学中用来衡量算法运行时间随输入规模增加而增长的速度。简单来说&#xff0c;它是一个衡量算法执行效率的指标&#xff0c;表示算法运行所需时间与输入数据量之间的关系。 时间复杂度通常用大O符号&#xff08;O&#xff09;来表示&#…...

Unity实现广告滚动播放、循环播放、鼠标切换的效果

效果&#xff1a; 场景结构&#xff1a; 特殊物体&#xff1a;panel下面用排列组件horizent layout group放置多个需要显示的面板&#xff0c;用mask遮罩好。 using System.Collections; using System.Collections.Generic; using DG.Tweening; using UnityEngine; using Unity…...

LangChain + Streamlit + Llama:将对话式AI引入本地机器

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建可二次编辑的3D应用场景 什么是LLMS&#xff1f; 大型语言模型 &#xff08;LLM&#xff09; 是指能够生成与人类语言非常相似的文本并以自然方式理解提示的机器学习模型。这些模型使用包括书籍、文章、网站和其他来源在内的…...

Python 读写 Excel 文件库推荐和使用教程

文章目录 前言Python 读写 Excel 库简介openpyxl 处理 Excel 文件教程pandas 处理 Excel 文件教程总结 前言 Python 读写 Excel 文件的库总体看还是很多的&#xff0c; 各有其优缺点&#xff0c; 以下用一图总结各库的优缺点&#xff0c; 同时对整体友好的库重点介绍其使用教程…...

“深入解析JVM:理解Java虚拟机的工作原理和优化技巧“

标题&#xff1a;深入解析JVM&#xff1a;理解Java虚拟机的工作原理和优化技巧 摘要&#xff1a;本文将深入探讨Java虚拟机&#xff08;JVM&#xff09;的工作原理和优化技巧。我们将从JVM的基本结构开始&#xff0c;逐步介绍其工作原理&#xff0c;并提供一些实际示例代码&am…...

解决SEGGER Embedded Studio无法显示Nordic MCU外设寄存器问题

如果使用SES调试NRF52840的时候发现&#xff0c;官方例程只能显示CPU寄存器&#xff0c;但是无法显示外设寄存器时&#xff0c;解决办法如下&#xff1a; 1.在解决方案右键→Options→Debug→Debugger&#xff0c;然后Target Device选择正确的型号。 2.Register Definition Fil…...

群晖相册AI识别解锁指南:让无GPU设备也能享受智能相册功能

群晖相册AI识别解锁指南&#xff1a;让无GPU设备也能享受智能相册功能 【免费下载链接】Synology_Photos_Face_Patch Synology Photos Facial Recognition Patch 项目地址: https://gitcode.com/gh_mirrors/sy/Synology_Photos_Face_Patch 你是否拥有DS918或DS3615xs等群…...

审核员能力模型——冰山模型说人话版

&#x1f4cb; 审核概论系列 第9篇/共10篇知识和技能不等于能力。认证审核员到底需要什么能力&#xff1f;麦克利兰冰山模型告诉你&#x1f4ca; 真实场景&#xff1a;CCAA注册审核员考试通过率大约只有30%-40%。很多人专业知识学了不少&#xff0c;ISO 9001标准背得滚瓜烂熟&…...

告别语法冲突!用SLR分析法搞定编译原理中的移进/归约难题(附FOLLOW集实战)

告别语法冲突&#xff01;用SLR分析法搞定编译原理中的移进/归约难题&#xff08;附FOLLOW集实战&#xff09; 当你第一次尝试构建LR(0)分析表时&#xff0c;是否遇到过这样的报错&#xff1a;"状态I2存在移进/归约冲突"&#xff1f;这种既想移进又想归约的矛盾&…...

CANN/ge图引擎AIPP补边参数设置

aclmdlSetAIPPPaddingParams 【免费下载链接】ge GE&#xff08;Graph Engine&#xff09;是面向昇腾的图编译器和执行器&#xff0c;提供了计算图优化、多流并行、内存复用和模型下沉等技术手段&#xff0c;加速模型执行效率&#xff0c;减少模型内存占用。 GE 提供对 PyTorch…...

如何快速集成KYGooeyMenu:iOS粘液菜单的完整实现指南

如何快速集成KYGooeyMenu&#xff1a;iOS粘液菜单的完整实现指南 【免费下载链接】KYGooeyMenu A not bad gooey effects menu. 项目地址: https://gitcode.com/gh_mirrors/ky/KYGooeyMenu KYGooeyMenu是一款为iOS应用打造的粘液效果菜单组件&#xff0c;能为你的应用添…...

面试官问KMP?别慌!用这道LeetCode 28题(实现strStr())现场给你讲明白

面试官问KMP&#xff1f;别慌&#xff01;用这道LeetCode 28题&#xff08;实现strStr()&#xff09;现场给你讲明白 当面试官在白板上写下"实现strStr()"这道题时&#xff0c;许多候选人的第一反应是暴力匹配——直到被追问"有没有更优解&#xff1f;"才意…...

深入解析:NRF24L01如何“伪装”成蓝牙设备?STM32实战代码拆解

深入解析&#xff1a;NRF24L01如何“伪装”成蓝牙设备&#xff1f;STM32实战代码拆解 在物联网设备爆炸式增长的今天&#xff0c;2.4GHz频段已成为无线通信的主战场。NRF24L01作为一款经典的射频芯片&#xff0c;以其低廉的价格和稳定的性能赢得了大量开发者的青睐。而蓝牙技术…...

连接器选型三张“底牌”:电源、高速、射频的隐性代价与系统级权衡

当产品进入量产阶段&#xff0c;连接器往往是“压死骆驼的最后一根稻草”。它不像芯片那样有明确的数据手册边界&#xff0c;也不像PCB那样可归咎于Layout规则。连接器的失效模式高度依赖“配合状态”——插拔了几次&#xff1f;压接用了什么工具&#xff1f;相邻器件发热多少&…...

3个步骤掌握Sketch MeaXure:设计师与开发者的终极协作桥梁

3个步骤掌握Sketch MeaXure&#xff1a;设计师与开发者的终极协作桥梁 【免费下载链接】sketch-meaxure 项目地址: https://gitcode.com/gh_mirrors/sk/sketch-meaxure 你是否厌倦了在Sketch中手动测量每个元素、反复截图标注的日子&#xff1f;Sketch MeaXure正是为解…...

从-15dBm到+16dBm:STC8G信标FM射频放大链路实测与优化

1. 从零开始的FM信标信号放大实战 去年我在做一个野外定位项目时&#xff0c;遇到了一个棘手的问题&#xff1a;用STC8G微控制器生成的FM信标信号&#xff0c;在空旷地带的有效传输距离还不到50米。当时测得的初始输出功率只有-15dBm左右&#xff0c;这个强度连穿过一片小树林都…...