Skip to content

搜索表单 SearchForm

CipSearchForm 用于渲染搜索表单,常用于列表页的搜索筛选。

基本使用

vue
<template>
  <DrSearchForm 
    v-model:model="searchModel" 
    :fieldList="searchFieldList"
    @search="handleSearch"
  />
</template>

<script setup>
import { ref } from 'vue'
import { generateFieldList, defineSearchFieldConfig } from 'd-render'

const searchModel = ref({})

const searchFieldList = generateFieldList(defineSearchFieldConfig({
  keyword: {
    type: 'input',
    label: '关键词'
  },
  status: {
    type: 'select',
    label: '状态',
    options: [
      { value: 1, label: '启用' },
      { value: 0, label: '禁用' }
    ]
  }
}))

const handleSearch = (val) => {
  console.log('搜索:', val)
}
</script>

Props

属性类型默认值说明
modelObject-搜索数据(支持 v-model)
fieldListArray[]字段配置列表
gridnumber | 'auto''auto'栅格列数,auto 时自动适配宽度
labelPositionstring-label 位置
hideSearchbooleanfalse是否隐藏搜索按钮
handleAbsoluteboolean-操作按钮是否绝对定位
collapsebooleantrue超过一行是否自动收缩
searchButtonTextstring-搜索按钮文字
searchResetboolean-是否显示重置按钮
equipmentstring'pc'设备类型
defaultModelObject-默认搜索条件(重置时使用)

Events

事件参数说明
update:model(model)数据更新
search(model)点击搜索按钮

自动栅格

搜索表单支持根据容器宽度自动调整列数:

vue
<DrSearchForm :grid="'auto'" :fieldList="fieldList" />

折叠展开

默认超过一行自动折叠,点击"展开"显示更多:

vue
<DrSearchForm :collapse="true" :fieldList="fieldList" />

禁用折叠:

vue
<DrSearchForm :collapse="false" :fieldList="fieldList" />

即时搜索

配置 immediateSearch 实现变更即搜索:

js
{
  keyword: {
    type: 'input',
    label: '关键词',
    immediateSearch: true
  }
}

重置功能

vue
<DrSearchForm 
  :searchReset="true"
  :defaultModel="{ status: 1 }"
  @search="handleSearch"
/>

点击重置会恢复到 defaultModel 的值。

搜索表单专属配置

immediateSearch

变更时立即触发搜索。

js
{
  status: {
    type: 'select',
    label: '状态',
    immediateSearch: true,
    options: [...]
  }
}

autoSelect

选项类组件自动选择第一个选项。

js
{
  category: {
    type: 'select',
    label: '分类',
    autoSelect: true,
    asyncOptions: async () => {
      return await fetchCategories()
    }
  }
}

完整示例

vue
<template>
  <DrSearchForm
    v-model:model="searchModel"
    :fieldList="searchFieldList"
    :collapse="true"
    :searchReset="true"
    @search="handleSearch"
  />
</template>

<script setup>
import { ref } from 'vue'
import { generateFieldList, defineSearchFieldConfig } from 'd-render'

const searchModel = ref({
  status: 1  // 默认值
})

const searchFieldList = generateFieldList(defineSearchFieldConfig({
  keyword: {
    type: 'input',
    label: '关键词',
    placeholder: '请输入名称/编码'
  },
  status: {
    type: 'select',
    label: '状态',
    immediateSearch: true,
    options: [
      { value: '', label: '全部' },
      { value: 1, label: '启用' },
      { value: 0, label: '禁用' }
    ]
  },
  createTime: {
    type: 'dateRange',
    label: '创建时间',
    otherKey: 'createEndTime'
  },
  category: {
    type: 'select',
    label: '分类',
    dependOn: ['status'],
    asyncOptions: async ({ status }) => {
      return await fetchCategories({ status })
    }
  }
}))

const handleSearch = (val) => {
  // 调用接口搜索
  fetchData(val)
}
</script>