Prop: filterFields

  • type: Array
  • default: []

配置搜索栏搜索字段,一个数组项对应一个表单字段。支持传入 Object 和 JSX 。

配置属性

公共配置

以下为所有类型都共有的属性配置:

参数 必须 类型 说明
type String 字段类型
model String 提交时字段的 key 名
label String 字段中文说明
disabled Boolean 是否禁用
get Function 配置字段的取值格式,具体请查看 get 小节说明
key String 同 vue 组件的 :key 属性,若不设置会直接使用子项的 model
componentProps Object 可传入各自组件自身的 props ,具体可查看 componentProps
componentEvents Object 可传入各自组件自身的 events ,具体可查看 componentEvents
componentSlots Object 可传入各自组件支持的 slots ,具体可查看 componentSlots

type 字段类型可选值

内置的可选字段类型有:

type 说明 对应 Element-UI 组件
label 文本标签 纯文本,无对应组件
text 文本字段 Text
number 数字输入 Number
select 单选 Select
multipleSelect 多选 MultipleSelect
date 日期选择 Date
dateRange 日期范围 DateRange
timeSelect 固定时间选项 TimeSelect
timePicker 任意时间 TimePicker
timePickerRange 时间范围 TimePickerRange
dateTime 日期时间 DateTime
dateTimeRange 日期时间范围 DateTimeRange
cascader 级联选项 Cascader

get

  • 参数: get(value, filterModel)

可配置单个字段的取值方法,对内置组件的原始值进行加工后再提交到请求方法内。

如,内置的多选组件 multipleSelect 默认值的格式为数组,如果接口参数要求为逗号分隔的字符串,一个方法是可以通过 transformRequestData 在提交前对整个参数对象进行加工过滤,另一个方法则可以通过配置 get :

;[
  {
    type: 'multipleSelect',
    model: 'multipleSelect',
    label: '多选字段',
    options: [
      { label: '选项 1', value: 1 },
      { label: '选项 2', value: 2 },
      { label: '选项 3', value: 3 }
    ],
    get: val => val.join(',')
  }
]
1
2
3
4
5
6
7
8
9
10
11
12
13

注意

必须返回有效值,不然提交参数内会丢失该参数。

如果 get() 方法抛出错误,会以原始值提交,并在控制台给出相应的错误信息。

第二个参数 filterModel 为所有字段内容,即 Props filter-model 的一个引用,因此对于 dateRange 等“范围”类型的字段,如果需要提交为单独 2 个字符串形式的话,可用以下方式:

{
  type: 'dateRange',
  model: 'startDate',
  label: '日期范围',
  get(val, filterModel) {
    const [startDate, endDate] = val
    filterModel.endDate = endDate
    return startDate
  }
}
1
2
3
4
5
6
7
8
9
10

私有配置 trim 1.2.11+

  • type: Boolean

对于 text 字段,默认在失焦后会执行 trim 操作,传入 false 即可关闭该行为。

私有配置 options

  • type: Array | Promise | () => Promise<options> | (done) => void
  • default: []

对于 select , multipleSelect , cascader 字段,可通过 options 属性配置选项值:

select

支持属性和 optionAttributes 相同。

参数 说明 类型 可选值 默认值
value 选项的值 string/number/object - -
label 选项的标签 string/number - -
disabled 是否禁用 boolean - false

multipleSelect

与上面 select 相同,略。

cascader

支持属性和 Cascader - options 相同。

异步选项 1.1.0+

有时需要从其他接口选项内容,可在 options 传入函数来进行异步填充,支持 2 种方式:

1. Promise

{
  type: 'select',
  model: 'promiseOptions',
  label: 'promiseOptions',
  options() {
    return new Promise(resolve => {
      setTimeout(() => {
        resolve([
          { label: '单选项 1', value: 1 },
          { label: '单选项 2', value: 2 },
          { label: '单选项 3', value: 3 }
        ])
      }, 3000)
    })
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

2. 使用第一个参数 done(options)

{
  type: 'multipleSelect',
  model: 'asyncOptions',
  label: 'asyncOptions',
  options: done => {
    setTimeout(() => {
      done([
        { label: '多选项 1', value: 1 },
        { label: '多选项 2', value: 2 },
        { label: '多选项 3', value: 3 }
      ])
    }, 3000)
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

componentSlots

  • type: Object
  • default: {}

该配置目前仅对于 text 类型字段有效,可通过添加组件支持的 slot 名 prepend append 为文本框添加前置或后置附加元素,支持 JSX:

{
  type: 'text',
  componentSlots: {
    prepend: '$',
    append: '$'
    // prepend: <strong>$</strong>,
    // append: <strong>$</strong>
  },
},
1
2
3
4
5
6
7
8
9

componentProps

  • type: Object
  • default: {}

除了上面封装的“公共配置”和“私有配置”,如果针对不同字段组件有不同的参数配置,可以查阅各自对应 Element-UI 组件支持的 props 后,使用 componentProps 来直接传入,例:

{
  type: 'text',
  model: 'datatext',
  componentProps: {
    'suffix-icon': 'el-icon-date'
  }
},
1
2
3
4
5
6
7

componentEvents

  • type: Object
  • default: {}

可传入各自对应 Element-UI 组件的 Events 。

组合 1.1.0+

搜索栏每个字段组件为一个单位,默认超过屏幕宽度的组件会自动收起。

但对于有些需要组合多个字段组件的场景(如 “开始-结束” 2 个文本框),不想被自动收起功能分开成 2 个部分,可以使用组合配置形式,组合内的所有组件会视为一个单位,在收起时不被拆开,配置方式为将想要组合的元素放入一个数组内:

{
  // ...
  filterFields: [
    { type: 'text', model: 'text', label: '普通文本' },
    // 以下 2 个文本字段会展现为一个整体
    [
      { type: 'text', model: 'text1', label: '文本1' },
      { type: 'text', model: 'text2', label: '文本2' }
    ]
  ]
}
1
2
3
4
5
6
7
8
9
10
11

JSX

也支持直接传入 JSX ,但注意通过这种形式传入的表单元素所包含的值不会包含在提交参数内,需要自行将需要提交的数据在合适的时间点写入给 filterModel ,或者通过 transformRequestData 来附加包含相应的数据

export default {
  data() {
    return {
      filterModel: {
        jsx: 'text from data'
      },
      filterButtons: [
        {
          // 如果需要渲染本实例内的数据,可使用 render 属性。需要注意 `render` 对内部 this 指向有要求,因此需要通过以下的形式定义:
          render: () => {
            return (
              <input
                value={this.filterModel.jsx}
                on-input={e => (this.filterModel.jsx = e.target.value)}
              />
            )
          }
        },

        // 或
        {
          render: function() {
            return (
              <input
                value={this.text}
                on-input={e => (this.text = e.target.value)}
              />
            )
          }.bind(this)
        },

        // 也支持使用 label 设置顶部的字段说明装饰元素,
        // 但需要注意需要设置 model 以及 filterModel 内有相匹配的属性,
        // 如果是自定义组件需要自行实现写入值的逻辑,
        // 参数 field 为该 object 项自身。
        {
          label: 'jsx',
          model: 'jsx',
          render: field => {
            return (
              <input
                value={this.filterModel.jsx}
                on-input={e => (this.filterModel.jsx = e.target.value)}
              />
            )
          }
        },

        // 或者可以简写成
        () => (
          <input
            value={this.text}
            on-input={e => (this.text = e.target.value)}
          />
        ),

        // 对于只需要绑定事件的场景,可以简写成以下的形式。
        // 注意:由于 JSX 解析后 this 指向会改变,因此如果需要立即使用本实例自身数据(如输出数据到内容)的时候,不能用下面这种形式。
        <button on-click={this.showDialog}>JSX 按钮</button>,
        <button on-click={() => this.showDialog(this.text)}>JSX 按钮</button>
      ]
    }
  },
  methods: {
    showDialog(text) {}
  }
  // ...
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
上次更新: 2019-12-10 14:05:31