PickerSelect
弹窗版下拉选择框
Template 弹窗表格选择
<script setup lang="tsx">
import { createForm } from '@formily/core'
import { FormDialog, FormItem, PickerSelect, SelectTable, Submit } from '@silver-formily/element-plus'
import { Field, FormProvider } from '@silver-formily/vue'
const form = createForm()
const userRows = [
{ id: 'u1', name: 'Ada Lovelace', team: 'Math' },
{ id: 'u2', name: 'Grace Hopper', team: 'Compiler' },
{ id: 'u3', name: 'Linus Torvalds', team: 'Kernel' },
]
const userOptions = userRows.map(item => ({
label: `${item.name} / ${item.team}`,
value: item.id,
raw: item,
}))
function openUserPicker({ field }) {
return FormDialog('选择成员', () => (
<Field
name="users"
component={[
SelectTable,
{
rowKey: 'id',
optionAsValue: true,
columns: [
{ prop: 'name', label: '姓名' },
{ prop: 'team', label: '团队' },
],
},
]}
dataSource={userRows}
/>
))
.forOpen((payload, next) => {
next({
...payload,
initialValues: {
users: userRows.filter(item => field?.value?.includes?.(item.id)),
},
})
})
.open()
.then(values => values.users.map(item => ({
label: `${item.name} / ${item.team}`,
value: item.id,
raw: item,
})))
}
function log(value: any) {
console.log(value)
}
</script>
<template>
<FormProvider :form="form">
<Field
name="users"
title="成员"
:decorator="[FormItem]"
:component="[
PickerSelect,
{
multiple: true,
clearable: true,
collapseTags: true,
collapseTagsTooltip: true,
openPicker: openUserPicker,
placeholder: '点击选择成员',
},
]"
:initial-value="['u1', 'u2', 'u3']"
:data-source="userOptions"
/>
<Submit style="margin-top: 16px" @submit="log">
提交
</Submit>
</FormProvider>
</template>成员:
查看源码
API
参考 https://cn.element-plus.org/zh-CN/component/select.html
扩展属性
| 属性名 | 类型 | 描述 | 默认值 |
|---|---|---|---|
| options | PickerSelectOption[] | 候选项配置,一般情况下优先通过 dataSource 注入 | [] |
| openPicker | function | 点击选择器后触发的选择函数,通常返回 FormDialog(...).open() 处理后的 option / option[] | - |
| cacheSelectedOptions | boolean | 是否缓存 openPicker 返回的 option,用于在 dataSource 未同步更新时优先展示 label | true |
提示
openPicker返回的是一个对象PickerSelectOption而不直接是Field的值。如果开启了
cacheSelectedOptions则会缓存这些对象,Field的值是对象中的value属性;如果关闭了则自行加载相应的dataSource(如:还没有打开Dialog就已经有初始值的情况)。当字段当前值在
dataSource中找不到匹配项时,会回退显示对应的value。
PickerSelectOption
ts
interface PickerSelectOption {
label: string
value: any
disabled?: boolean
// 可扩展其他业务字段,组件内部不会读取
}插槽
组件继承 ElSelect 的常用展示插槽,第一版主要保留 prefix、empty、tag、loading、label 的原始能力,不额外扩展作用域协议。