使用Antd EditableProTable 根据每一行A列的值 渲染B列的组件

最近有一个需求, 做资产的批量属性更新

所以在前端的呈现就是, 用户可以自己选择某个属性,然后根据选择的属性, 渲染出这个属性可以输入的值

下面视频就是实际效果


下面是代码

export default ({ data }) => {
    const [form] = Form.useForm();
    const [editableKeys, setEditableRowKeys] = useState([]);
    const [dataSource, setDataSource] = useState([]);
    const [fliedMap, setFliedMap] = useState({})
    const formRef = useRef()
    const editFormRef = useRef()
    const columns = [
        {
            title: <FormattedMessage id="DMT63" />,
            dataIndex: 'Name',
            width: '40%',
            renderFormItem: (record,_) => {
                return (
                    <Select onSelect={(v) => {
                        let newData = fliedMap
                        newData[record.index] = v
                        setFliedMap(newData)
                        editFormRef?.current?.setRowData(record.entity.id, {  Value: undefined })
                    }} showSearch style={{ width: "150px" }} options={deviceFliedOptions} allowClear />
                )
            },
            render: (v) => {
                return SMaxDeviceFeildNamei18Map[v]
            },
            formItemProps: {
                rules: [
                    {
                        required: true,
                        message: <FormattedMessage id="CR1" />,
                    },
                ],
            },
        },
        {
            title: <FormattedMessage id="wt_value" />,
            dataIndex: 'Value',
            width: '40%',
            formItemProps: {
                rules: [
                    {
                        required: true,
                        message: <FormattedMessage id="CR1" />,
                    },
                ],
            },
            renderFormItem: (v) => {
                switch (fliedMap[v.index]) {
                    case "Status":
                        return <ProFormSelect showSearch options={DeviceStatusOptions} />
                    case "Type":
                        return <ProFormSelect showSearch options={[{ label: <FormattedMessage id="DMT5" />, value: 0 }, { label: <FormattedMessage id="DMT6" />, value: 1 }]} />
                    case "Model":
                        return <ProFormSelect showSearch request={async () => { return await options.options("SMaxModel") }} debounceTime={500000} />
                    case "Role":
                        return <ProFormSelect showSearch options={DeviceRoleOptions} />
                    case "InvoicingEntity":
                        return <ProFormSelect showSearch request={async () => { return await options.options("SMaxInvoicingEntity") }} debounceTime={500000} />
                    case "Location":
                        return <ProFormSelect showSearch request={async () => { return await options.options("SMaxLocation") }} debounceTime={500000} />
                    case "CostCenter":
                        return <ProFormSelect showSearch request={async () => { return await options.options("SMaxCostCenter") }} debounceTime={500000} />
                    case "PersonProfile":
                        return <ProFormSelect showSearch request={async () => { return await options.options("SMaxPerson") }} debounceTime={500000} />
                    case "WarrantyEndDate":
                        return <ProFormDatePicker />
                    case "ProductLifetime":
                        return <ProFormSelect showSearch options={[{ label: 3, value: 3 }, { label: 5, value: 5 }]} />
                    case "Comments":
                        return <ProFormTextArea />
                    default:
                        return <Input disabled={true}/>
                }
            },
            render: (v) => {
                return v
            },
        },
        {
            title: <FormattedMessage id="AT45" />,
            valueType: 'option',
            width: '20%',
            render: (text, record, dom, action) => [
                <a
                    key="editable"
                    onClick={() => {
                        action?.startEditable?.(record.id);
                    }}
                >
                    <FormattedMessage id="AT48" />
                </a>,
                <a key="delete" onClick={() => {
                    const newD = dataSource.filter((item) => item.id !== record.id)
                    setDataSource(newD);
                    formRef?.current?.setFieldsValue({ fields: newD })
                }}>
                    <FormattedMessage id="AT49" />
                </a>,
            ],
        },

    ]


    return (<ModalForm
        formRef={formRef}
        title={<FormattedMessage id="DMT29" />}
        trigger={
            <Button type='link'><FormattedMessage id="DMT29" /></Button>
        }
        form={form}
        modalProps={{
            destroyOnClose: true,
            onCancel: () => console.log('run'),
        }}
        onFinish={(values)=> {
            let l  = []
            for (let i of values.fields){
                let flag = false
                for (let x of l){
                    if (i.Name === x){
                        showError("Please do not repeat the same field")
                        return
                    }
                    flag = true
                }
                if(!flag){
                    l.push(i.Name)
                }
            } 
        }}
        autoFocusFirstInput
        submitTimeout={2000}
    >
        <ProFormItem name="fields">

            <EditableProTable
                editableFormRef={editFormRef}
                columns={columns}
                rowKey='id'
                recordCreatorProps={{
                    position: 'bottom',
                    record: () => ({ id: (Math.random() * 1000000).toFixed(0) })
                }}
                onChange={setDataSource}
                editable={{
                    type: 'multiple',
                    editableKeys,
                    onChange: setEditableRowKeys,
                }}

            >

            </EditableProTable>
        </ProFormItem>
    </ModalForm>)
}

简单来说,我们有一个叫fliedMap的字典,当我们在A列选择的时候, 会把这一行的索引作为key, 选择的值作为value存进去,然后B列的渲染就会根据fliedMap里面value的值,去渲染不同的组件,当然 我们也需要在每一次选择的时候清除掉B列的值.否则会造成错误的属性值


评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注