组件系列--TableSearch查询组件【1】

316 阅读5分钟

组件背景

在编写项目时(特别是办公类项目),列表页面至少占据了70%左右UI开发。过程中一定会碰到两种情况:

  • 查询条件很少
  • 查询条件很多

当碰到查询条件很多的情况下,在小屏幕时,就会出现,可视范围都是查询条件,而没有列表信息。如下图: image.png

这是多么【难受】的事情啊。所以需要写一个列表查询组件去适配项目中的各种情况。

前言

  • 技术栈:vu3 + element ui plus + ts
  • 说在前面:这个控件需要分多篇来描述,因为内容有点多。

先看效果

  • 效果一: image.png

  • 效果二: image.png

  • 效果三: image.png

设计

  1. 设计的愿景:
  • 组件能够适配条件多的和条件少的各种情况。
  • 开发人员的使用心智负担不会因为条件多少而变化,使用的风格一致。
  1. 控件布局:
  • 组件需要考虑如何快速的适配布局
  • 组件需要考虑如何控制在页面中的显示占比
  1. 控件支持:
  • 组件需要支持默认的常用控件UI

  • 组件需要考虑如何动态扩展

设计的愿景

  • 基于第一点,控件配置了三种模式:
    1. 默认全部显示;
    2. 默认显示一行,但可以收起和展开其他的条件;
    3. 默认显示关键条件,通过弹层显示所有的条件。

通过效果图,可以了解到这边的愿景,被很好的实现了。

控件布局

  • 通过【设计愿景】能够很好的解决显示占比的问题
  • 适配布局这点,通过学习 element ui中的控件 【# Descriptions 描述列表】的属性【column】。从而实现一行显示几个查询条件来完成。

控件支持

  • 因为控件使用Json的模式配置,目前支持了一些常用的控件。支持列表如下:

    参数说明
    Autocomplete自动补全输入框
    SelectMultiple下拉多选控件
    Select下拉选择控件
    Input输入框
    DatePicker日期选择,不带时间
    DateTime日期选择,带时间
    DateRangePicker日期范围选择,不带时间
    DateTimeRangePicker日期范围选择,带时间
  • 动态扩展

    目前并未实现

用法说明

以弹窗显示为例

设置控件属性type='hidden'。一般当查询的条件特别多,如果在列表页面显示,明显影响页面的优雅性时,使用该控件。

::: 样例代码

<template>
  <div>
    <SpTableSearch
      :type="'hidden'"
      :model="searchForm"
      :searchItems="itemsConfig"
      :labelPosition="'top'"
      @searchEvent="searchData"
      @resetDataEvent="resetData"
    >
    </SpTableSearch>
  </div>
</template>

<script>
// import { SpTableSearch } from '@sp/pc-ui'
import { defineComponent, reactive } from 'vue'
export default defineComponent({
  setup() {
    const searchData = (data: any) => {
      console.log('改变的数据:', data)
    }

    const resetData = (data: any) => {
      console.log('重置的数据:', data)
    }

    const handleSelect = (item: RestaurantItem) => {
      console.log('autocomplete:', item)
    }

    const searchForm = reactive({
      fieldName: '',
      fieldKey: '',
      state: '',
    })

    const itemsConfig = reactive([
      {
        label: '名称',
        prop: 'fieldName',
        uiType: 'Input',
        placeholder: '请输入名称',
        hiddenItem: true,
      },
      {
        label: '标识',
        prop: 'fieldKey',
        uiType: 'Input',
        placeholder: '请输入标识',
        hiddenItem: true,
      },
      {
        label: '前端技术',
        prop: 'state',
        uiType: 'Autocomplete',
        autocompleteData: [
          { value: 'vue', link: 'https://github.com/vuejs/vue' },
          { value: 'element', link: 'https://github.com/ElemeFE/element' },
          { value: 'cooking', link: 'https://github.com/ElemeFE/cooking' },
          { value: 'mint-ui', link: 'https://github.com/ElemeFE/mint-ui' },
          { value: 'vuex', link: 'https://github.com/vuejs/vuex' },
          { value: 'vue-router', link: 'https://github.com/vuejs/vue-router' },
          { value: 'babel', link: 'https://github.com/babel/babel' },
        ],
        autocompleteSelect: handleSelect,
      },
    ])

    return {
      searchForm,
      itemsConfig,
      searchData,
      resetData,
      handleSelect,
    }
  },
})
</script>

<style lang="less"></style>

控件属性说明

参数说明类型可选值默认值必填
type控件类型string 或 ShowTypes'default'/'oneLine'/'hidden''default'
model控件绑定的数据对象Object{}{}
column一行显示几列number1-102
labelPositionlabel 显示的位置string 或 LabelPositionTypes'left'/'right'/'top'/'topBorder''right'
labelWidthlabel 的宽度string'1px'-'Npx''100px'
searchItems配置查询控件集合SearchItemProps[][][]
contentStyle控件的样式string样例: :contentStyle="'padding-left:20px;'"''

控件事件

参数说明类型默认值必填
searchEvent查询触发Function()=>{}
resetDataEvent重置数据触发Function()=>{}

控件方法

参数说明类型使用范围必填
closeExpandStatus收起展开Functiontype==='hidden'
getExpandStatus获取是否展开Functiontype==='oneLine'

ShowTypes

参数说明
default默认使用
oneLine一行显示
hidden隐藏显示

LabelPositionTypes

参数说明
leftlabel 显示在左侧
rightlabel 显示在右侧
toplabel 显示在顶部
topBorderlabel 显示顶部边框上

SearchItemProps 查询控件的配置

参数说明值类型默认值使用范围
label查询描述string(必须)''所有
prop绑定查询对象的键值string(必须)''所有
uiType控件类型UiType(必须)Input所有
numberCopies控件占用几个位置,默认是一个位置number(非必须)2所有
placeholder控件提示描述string(非必须)根据 label 生成所有
hiddenItem设置为是否显示在顶部boolean(非必须)false只有'hidden'模式时有效
autocompleteData控件类型为'Autocomplete'时,配置的控件数据源RestaurantItem[]控件类型为'Autocomplete'时有效
selectEvent选择的事件响应函数事件回调函数(非必须)null存在 select 事件的控件有效
dateSeparator选择范围时的分隔符string(非必须)'To'范围选择的时间控件有效
dateFormat日期控件显示的时间格式string(非必须)'YYYY-MM-DD HH:mm:ss' or 'YYYY-MM-DD'时间控件有效
dateValueFormat选择的值的格式string(非必须)'YYYY-MM-DD HH:mm:ss'时间控件有效
changeEvent变更事件的响应函数事件回调函数(非必须)null存在 change 事件的控件有效
visibleChangeEvent下拉显示的事件响应函数事件回调函数(非必须)null存在 visible-change 事件的控件有效
dateStartPlaceholder范围选择时开始日期的占位内容string(非必须)''范围选择的时间控件有效
dateEndPlaceholder范围选择时结束日期的占位内容string(非必须)''范围选择的时间控件有效
selectDataselect 控件的数据源object[][]select 控件有效
selectLabelFieldselect 控件的 labelstring(非必须)''select 控件有效
selectValFieldselect 控件的 valuestring(非必须)''select 控件有效
datePickerStyle日期类控件的 style 设置string(非必须)''时间控件有效

结语

后面会再写一篇,在下一篇中会给出具体的实现代码,以及代码的设计思路。

在开发的过程中,发现某些事情,让你的开发特别不舒服的时候,就是组件、工具、插件等的开发需求产生的时候。不知道各位看客是否有同样的感受。

就像我前面写【swagger2-to-ts】这个工具一样,就是因为跟后端对接写ts的entity太无聊了。