You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于refine.dev与Ant Design实现多对多关联的多选选择器

解决方案

针对多对多关联的表单适配问题,无需修改后端,直接通过Ant Design Form的两个核心属性即可解决格式转换问题:

核心思路

Ant Design Select多选模式返回的是ID数组,但API要求的是包含id的对象数组;同时回显时API返回的是对象数组,需要转成ID数组给Select识别。通过getValueProps和normalize属性分别处理回显格式转换和提交格式转换。

代码实现

import { Form, Select } from 'antd';
import { useSelect } from '@refinedev/antd';

// 保持原useSelect配置不变
const { selectProps: relationsSelectProps } = useSelect<Relation>({
  resource: 'relations',
  optionLabel: 'name',
});

// 表单组件部分
<Form.Item
  name="relations"
  // 处理回显:将API返回的对象数组转成ID数组给Select
  getValueProps={(value) => ({
    value: value?.map(item => item.id) || [],
  })}
  // 处理提交:将Select选中的ID数组转成API需要的对象数组
  normalize={(value) => (
    value?.map(id => ({ id })) || []
  )}
>
  <Select
    mode="multiple"
    placeholder="选择关联关系"
    {...relationsSelectProps}
  />
</Form.Item>

关键属性说明

  • getValueProps:接收表单字段的原始值(即API返回的[{id:1}, {id:2}]),返回组件需要的props,这里把值转成[1,2],让Select能正确匹配选项并回显。
  • normalize:接收组件输出的值(即Select选中的[1,2]),返回最终要提交给API的格式,这里转成[{id:1}, {id:2}],完全匹配后端要求的结构。

额外优化

原useSelect中的defaultValue可以移除,因为getValueProps已经处理了回显逻辑,避免重复赋值导致的潜在冲突。

内容的提问来源于stack exchange,提问作者Konstantin Bodnia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 15:35:24