TransferProLov
© 转载需要保留原始链接,未经明确许可,禁止商业使用。支持原创 CC BY-NC-SA 4.0
危险
✂️ 当前组件已停止更新维护,该文档已归档并停止更新。
基于 TransferPro 实现,将 Modal.open 操作内置到组件中,渲染为 TextField 组件。

特性说明
- 支持
TransferPro所有特性 - 支持
record数据绑定
基本用法
- Index
- DataSet
index.tsx
import { useDataSet } from 'choerodon-ui/pro';
import { TransferProLov } from 'hscs-common/components';
import { getDSProps } from './store';
export default () => {
const tenantDS = useDataSet(getDSProps, []);
return <TransferProLov name="tenants" record={tenantDS.current} />;
};
store/index.ts
import { DataSetProps } from 'choerodon-ui/dataset/data-set/DataSet';
import { DataSetSelection, FieldIgnore, FieldType } from 'choerodon-ui/dataset/data-set/enum';
export const getDSProps = (): DataSetProps => {
return {
autoCreate: true,
// 测试数据
data: [
{
tenants: [
{
tenantName: '测试租户',
createdBy: 2,
tenantId: '52',
enabledFlag: 1,
tenantNum: 'TEST2',
creationDate: '2022-02-25 10:46:59',
},
{
tenantName: '自动化测试租户',
createdBy: 2,
tenantId: '51',
enabledFlag: 1,
tenantNum: 'AUTO_TEST',
creationDate: '2022-02-25 10:46:17',
},
{
tenantName: 'HZERO平台',
createdBy: -1,
tenantId: '0',
enabledFlag: 1,
tenantNum: 'HZERO',
creationDate: '2021-08-30 12:11:04',
},
],
},
],
fields: [
{
name: 'tenants',
type: FieldType.object,
lovCode: 'HPFM.TENANT_PAGING',
idField: 'tenantId',
textField: 'tenantName',
valueField: 'tenantNum',
ignore: FieldIgnore.always,
},
{
name: 'tenantId',
type: FieldType.string,
},
{
name: 'tenantName',
type: FieldType.string,
},
],
events: {
update: ({ dataSet, record, name, value, oldValue }) => {
console.log(dataSet, record, name, value, oldValue);
},
},
};
};
在表单中应用
import { TransferProLov } from 'hscs-common/components';
export default () => {
return (
<Form>
<TransferProLov name="tenant" record={tenantDS.current} label="租户" />
</Form>
);
};
API
| 参数 | 类型 | 说明 | 默认值 |
|---|---|---|---|
| name | string | 必输 字段名称 | - |
| record | Record | undefined | 必输 关联的 record | - |
| configProps | {data?:any; read?: TransportType } | 可选 源数据加载方式,仅当指定数据或自定义接口时用到 | - |
| modalProps | TLovModalProps | 可选 支持除 key maskClosable children onOk 以外的 ModalProps 所有属性 | - |
| 其他 | TransferProProps & FormFieldProps | 支持 TransferPro 除 configProps targetProps 外所有属性;支持 FormFieldProps 除 dataSet 所有属性。 [1] | - |
源代码
TransferProLov/index.tsx
import { Record } from 'choerodon-ui/dataset';
import { DataSetEvents } from 'choerodon-ui/dataset/data-set/enum';
import { Icon, Modal, TextField } from 'choerodon-ui/pro';
import type { TransportType } from 'choerodon-ui/pro/lib/data-set/interface';
import type { FormFieldProps } from 'choerodon-ui/pro/lib/field/FormField';
import type { ModalProps } from 'choerodon-ui/pro/lib/modal/Modal';
import { useObserver } from 'mobx-react-lite';
import * as React from 'react';
import type { TransferProProps } from '.';
import TransferPro from '.';
export type TLovModalProps = Omit<ModalProps, 'key' | 'maskClosable' | 'children' | 'onOk'>;
export type TransferProLovProps = Omit<FormFieldProps, 'dataSet'> & {
name: string;
record: Record | undefined;
configProps?: { data: any; read?: TransportType };
/**
* @description 弹窗属性
*/
modalProps?: TLovModalProps;
} & Omit<TransferProProps, 'targetProps' | 'configProps'>;
const modalKey = Modal.key();
/**
* @see https://changnian.netlify.app/docs/c7n/custom-components/transfer-pro-lov
*/
const TransferProLov: React.FC<TransferProLovProps> = ({
name,
record,
modalProps = {},
configProps,
avatarProps,
titles,
header,
footer,
className,
style,
searchable,
onChange,
renderItem,
...formProps
}) => {
const fieldProps = record?.dataSet.getField(name)?.props || new Map();
const [textField, valueField, primaryKey, lovCode, lookupCode] = [
fieldProps.get('textField') || 'textField',
fieldProps.get('valueField') || 'valueField',
fieldProps.get('idField') || 'id',
(fieldProps.get('lovCode') || '') as string | undefined,
fieldProps.get('lookupCode') || '',
];
const handleOk = ({ initialData, value }) => {
if (!record) {
return;
}
// 设置值
record.set({
[name]: value,
[textField]: value.map((v) => v[textField]),
[valueField]: value.map((v) => v[valueField]),
});
// 触发 update 事件
record.dataSet.fireEvent(DataSetEvents.update, {
name,
record,
dataSet: record.dataSet,
value,
oldValue: initialData,
});
};
const handleOpen = () => {
let config;
if (configProps?.data) {
config = { data: configProps?.data };
} else if (configProps?.read) {
config = { read: configProps?.read };
} else if (lovCode) {
config = { lovCode };
} else if (lookupCode) {
config = { lookupCode };
}
const transferProps: TransferProProps = {
configProps: {
primaryKey,
textField,
valueField,
lookupCode,
lovCode,
...config,
},
targetProps: {
primaryKey,
data: record?.get(name) || [],
},
avatarProps,
titles,
header,
footer,
style,
className,
searchable,
onChange,
renderItem,
};
Modal.open({
title: '选择',
style: { width: 600 },
...modalProps,
key: modalKey,
onOk: handleOk,
maskClosable: false,
children: <TransferPro {...transferProps} />,
} as ModalProps);
};
React.useEffect(() => {
// 初始化展示数据
if (record && record.get(name)) {
if (!record.get(textField)) {
record.set(
textField,
record
.get(name)
.map((r) => r[textField])
.filter(Boolean)
);
}
if (!record.get(valueField)) {
record.set(
valueField,
record
.get(name)
.map((r) => r[valueField])
.filter(Boolean)
);
}
}
}, [record?.get(name), textField, valueField]);
return useObserver(() => (
<TextField
{...formProps}
name={textField}
readOnly
multiple
record={record}
suffix={<Icon type="search" />}
onClick={handleOpen}
/>
));
};
export default TransferProLov;
Q & A
为什么不支持 FormFieldProps.dataSet
可以,但没必要。应用场景类似于表单项,record 更方便直接取值;其次 record.dataSet 也能够获取关联的 DataSet。
这和 TransferButton 有什么不一样
内部实现不同:
Button更倾向于操作,不涉及回显;所以内部实现时Button可以在弹窗展开时加载数据;- 而
Lov更倾向于回显。故Lov在一开始就必须 (通过record) 提供回显的数据,值的变更也会自动同步到绑定的record中,并触发dataSet的update事件。
更新日志
0.1.1
- 🎉
hscs-front-common@0.1.1起支持该组件
alpha
2023-05-16
- 🎉 新增
ConfigProps.data支持手动加载源数据