如何在表单下拉MenuItem中获取选中对象的ll._id用于后端提交?
解决方案
方法1:直接将_id设为选项值(推荐)
既然后端需要接收_id,最直接的方式就是把MenuItem的value设为ll._id,同时保持显示内容为ll.llID,这样表单字段landlord会直接绑定到_id,无需额外转换。
需要调整两处代码:
- 修改
MenuItem的value属性为ll._id - 修正
defaultValue,使其匹配选中项的_id(如果数据源中已有landlord._id直接使用;若只有llID,则从landlords数组中匹配对应的_id)
修改后的完整代码:
<TextField id="ll-id" select label="LL-ID" defaultValue={ row ? row.original.landlord._id : "" // 若row中仅存llID无_id,替换为下方逻辑: // row // ? landlords.find(ll => ll.llID === row.original.landlord.llID)?._id || "" // : "" } {...register("landlord")} > {landlords.map((ll) => ( <MenuItem key={ll._id} value={ll._id}> {ll.llID} </MenuItem> ))} </TextField>
方法2:通过映射表转换(兼容原有value设置)
如果因业务限制无法直接修改选项值,可以提前创建llID与_id的映射关系,在表单提交时完成转换:
- 先构建映射表:
// 在组件内部定义映射表 const llIdToObjectIdMap = Object.fromEntries( landlords.map(ll => [ll.llID, ll._id]) );
- 提交表单时转换字段值:
const handleSubmit = (formData) => { // 替换landlord字段为对应的_id const submitData = { ...formData, landlord: llIdToObjectIdMap[formData.landlord] || formData.landlord }; // 提交submitData到后端 };
内容的提问来源于stack exchange,提问作者Lelouch
相关产品推荐
相关产品推荐

