获取数据后如何转换值?useController字段onChange更新失效求助
问题解决方案
一、getOne获取数据后转换返回值的可行方案
当然有,常用的两种实现思路:
1. 数据获取后直接转换
拿到getOne接口返回的原始数据后,编写转换函数处理目标字段,灵活可控,不依赖框架或ORM的特殊配置。针对你给出的格式需求,示例代码如下:
// 转换函数:将{key: {keyName: keyValue}}格式转为[{name: keyName, value: keyValue}] function transformKeyValue(rawObj) { return Object.entries(rawObj).map(([keyName, keyValue]) => ({ name: keyName, value: keyValue })); } // 使用示例:假设getOne返回的数据存在response中 const response = await getOne(); const transformedData = { ...response, // 保留原数据的其他字段 targetField: transformKeyValue(response.targetField) // 转换指定字段 };
2. 借助ORM/框架的序列化能力
如果用TypeORM、Prisma这类ORM工具,可以通过实体类的自定义序列化规则自动完成转换。以TypeORM为例:
import { Transform } from "class-transformer"; class YourEntity { // 其他字段... @Transform(({ value }) => { return Object.entries(value).map(([name, value]) => ({ name, value })); }) targetField: Record<string, any>; } // 查询时自动完成格式转换 const entity = await getOne(YourEntity, { where: { id: 1 } }); // entity.targetField已转换为数组格式
二、解决field.onChange不更新字段的问题
你的代码存在两个核心问题,对应修正方案如下:
问题1:useEffect仅执行一次,未监听数据变化
你设置的useEffect依赖数组为空,只会在组件挂载时执行一次,此时field.value大概率还未拿到getOne返回的有效数据,无法完成正确转换。
问题2:未处理重复转换的循环触发
调用field.onChange会更新field.value,若不加判断会触发无限循环。
修正后的代码示例
const { field }: any = useController({ name: 'headers', rules: { required: 'The field is required' } }); // 替换为你实际的getOne数据获取逻辑,比如useQuery const { data: getOneData } = useQuery(['getOneData'], () => fetchYourGetOneData()); useEffect(() => { // 确保getOne数据已获取,且原始headers字段存在 if (!getOneData?.headers) return; const rawHeaders = getOneData.headers; // 避免重复转换:如果当前field.value已是数组,说明已处理过 if (Array.isArray(field.value)) return; // 转换格式 const newValue = Object.entries(rawHeaders).map(([headerName, headerValue]) => ({ headerName, headerValue })); // 更新字段 field.onChange(newValue); }, [getOneData, field.value, field.onChange]); // 监听数据和字段状态变化
额外注意事项
- 如果你的form是通过
setValue先写入getOne数据,需确保setValue执行完成后再触发转换,可将setValue的相关状态加入依赖项。 - 确认
headers字段在form配置中允许数组类型,避免因类型不匹配导致更新被忽略。
内容的提问来源于stack exchange,提问作者David Hovhannisyan
相关产品推荐
相关产品推荐

