您的位置:首页 > 文旅 > 旅游 > vue3列表页搜索条件封装

vue3列表页搜索条件封装

2024/12/23 2:33:27 来源:https://blog.csdn.net/yan1915766026/article/details/141275349  浏览:    关键词:vue3列表页搜索条件封装

搜索框组件

  • 封装常用搜索框组件,类型有:
    • input(默认值)
    • select
    • selectV2 (value/label键值对数组)
    • datePicker
    • year
  • 集成新增、修改、删除、导入、导出按钮,支持slot自定义其他按钮
  • 封装搜索、重置按钮
  • 封装按钮权限
  • 封装导入弹框

本例仅列出常用的封装,其他类型的可自行加入

参数

名称类型必传说明
queryParamsObjecttrue搜索框的变量值
searchOptionsArraytrue搜索框显示的值及参数类型,具体见下表
showSearchBooleanfalse是否显示右侧搜索功能组
btnListArrayfalse按钮组,默认值:[‘add’, ‘edit’, ‘remove’, ‘import’, ‘export’]
singleBooleanfalse单选
multipleBooleanfalse多选
authPreFixStringfalse权限前缀
exportUrlStringfalse导出url,可优化省略掉
titleStringfalse导出名称
searchOptions属性
名称默认值可选说明
label表单名称
prop参数名称
typeinputselect、selectV2、datePicker、year类型
width200宽度
options选项
valueFormat日起值格式
disabled是否禁用

用法

 <search-toolref="searchRef":search-options="searchOptions":query-params="queryParams"@query="handleQuery"@reset="handleReset"/>const searchOptions3 = reactive([{ prop: 'code', label: '自动配置编码', },{ prop: 'userName', label: '用户名称', },{ prop: 'year', label: '注册年份', type: 'year', },{ prop: 'type', label: '类型', type: 'select', options: [], },{ prop: 'auditFlag', label: '审核标识', type: 'select', options: [], },
])

这样,一个搜索栏就做好了,有以下好处:

  • 格式样式统一;
  • 代码简洁;
  • 便于维护;

源码

<template>
<!--  搜索区域--><el-form :model="props.queryParams" ref="queryRef" :inline="true" v-show="showSearch2"><el-form-item v-for="(item, index) in props.searchOptions" :key="index" :label="item.label" :prop="item.prop"><el-inputv-if="item.type === 'input' || !item.type"v-model="props.queryParams[item.prop]":placeholder="'请输入' + item.label"clearable:style="`width:${item.width || defaultWidth}px`"@keyup.enter="handleQuery"/><el-selectv-if="item.type === 'select'"v-model="props.queryParams[item.prop]":placeholder="'请选择' + item.label"clearablefilterable:style="`width:${item.width || defaultWidth}px`"><el-optionv-for="dict in item.options":key="dict.value":label="dict.label":value="dict.value"/></el-select><el-select-v2v-if="item.type === 'selectV2'"v-model="props.queryParams[item.prop]":options="item.options"clearablefilterable:style="`width:${item.width || defaultWidth}px`":placeholder="'请选择' + item.label"/><el-date-pickerv-if="item.type === 'datePicker'"v-model="props.queryParams[item.prop]":value-format="item.valueFormat || defaultTimeFormat":format="item.format || defaultTimeFormat"type="daterange"range-separator="-"start-placeholder="开始日期"end-placeholder="结束日期":style="`width:${item.width || 180}px`"></el-date-picker><el-date-pickerv-if="item.type === 'year'"v-model="props.queryParams[item.prop]"type="year"value-format="YYYY":placeholder="'请选择' + item.label":style="`width:${item.width || 120}px`":disabled="item.disabled"/></el-form-item><el-form-item><el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button><el-button icon="Refresh" @click="resetQuery">重置</el-button></el-form-item></el-form>
</template><script setup>
import { getCurrentInstance, ref } from "vue";const props = defineProps({queryParams: { type: Object, required: true, },searchOptions: {type: Array,required: true,default: () => {return []},},showSearch: { type: Boolean, default: true },// 显隐列columns: { type: Array, default: () => [] }
})
const emits = defineEmits(['query', 'reset'])
const { proxy } = getCurrentInstance();
const showSearch2 = ref(props.showSearch)// 默认宽度
const defaultWidth = ref(200)
// 默认时间格式
const defaultTimeFormat = 'YYYY-MM-DD'// 搜索
const handleQuery = () => { emits('query') }// 重置
const resetQuery = () => {proxy.resetForm("queryRef");emits('reset')
}
</script>

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com