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-tool
   ref="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-input
        v-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-select
        v-if="item.type === 'select'"
        v-model="props.queryParams[item.prop]"
        :placeholder="'请选择' + item.label"
        clearable
        filterable
        :style="`width:${item.width || defaultWidth}px`"
      >
        <el-option
          v-for="dict in item.options"
          :key="dict.value"
          :label="dict.label"
          :value="dict.value"
        />
      </el-select>

      <el-select-v2
        v-if="item.type === 'selectV2'"
        v-model="props.queryParams[item.prop]"
        :options="item.options"
        clearable
        filterable
        :style="`width:${item.width || defaultWidth}px`"
        :placeholder="'请选择' + item.label"
      />

      <el-date-picker
        v-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-picker
        v-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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值