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

如何将useQuery返回值安全应用于useForm的defaultValues?

解决useQuery数据未加载时无法直接给useForm赋值的问题

方法1:等待数据加载完成再初始化表单

useQuery在请求完成前estimateData是undefined,所以可以先判断加载状态,等数据就绪后再初始化useForm,这样就能直接访问estimateData的属性:

const { data: estimateData, isLoading: isEstimateDataLoading } = useQuery<EstimateRequire>([`getOneEstimate`, estimatePk, `estimate_detail`], getOneEstimate);

// 加载中时显示占位内容,不渲染表单逻辑
if (isEstimateDataLoading) {
  return <div>加载中...</div>;
}

// 数据加载完成后,estimateData必然存在,直接取值即可
const { register, handleSubmit, watch, reset } = useForm<EstimateRequireForm>({
  defaultValues: {
    title: estimateData.title,
    product: estimateData.product,
    email: estimateData.email,
    manager: estimateData.manager,
    phone_number: estimateData.phone_number,
    content: estimateData.content,
    estimate_require_completion: estimateData.estimate_require_completion,
    memo: estimateData.memo,
  },
});

方法2:给estimateData设置类型匹配的默认值

解构useQuery返回值时,给data设置一个符合EstimateRequire类型的空对象作为默认值,这样即使数据还没加载,也能安全访问属性:

// 定义与EstimateRequire类型一致的默认空数据
const defaultEstimateData: EstimateRequire = {
  title: '',
  product: '',
  email: '',
  manager: '',
  phone_number: '',
  content: '',
  estimate_require_completion: '',
  memo: '',
};

const { data: estimateData = defaultEstimateData, isLoading: isEstimateDataLoading } = useQuery<EstimateRequire>([`getOneEstimate`, estimatePk, `estimate_detail`], getOneEstimate);

const { register, handleSubmit, watch, reset } = useForm<EstimateRequireForm>({
  defaultValues: {
    title: estimateData.title,
    product: estimateData.product,
    email: estimateData.email,
    manager: estimateData.manager,
    phone_number: estimateData.phone_number,
    content: estimateData.content,
    estimate_require_completion: estimateData.estimate_require_completion,
    memo: estimateData.memo,
  },
});

方法3:初始化空表单,数据加载后用reset更新

先给useForm设置空的defaultValues,等estimateData加载完成后,调用reset方法把数据同步到表单中:

const { data: estimateData, isLoading: isEstimateDataLoading } = useQuery<EstimateRequire>([`getOneEstimate`, estimatePk, `estimate_detail`], getOneEstimate);

const { register, handleSubmit, watch, reset } = useForm<EstimateRequireForm>({
  defaultValues: {
    title: '',
    product: '',
    email: '',
    manager: '',
    phone_number: '',
    content: '',
    estimate_require_completion: '',
    memo: '',
  },
});

// 监听estimateData变化,数据就绪时重置表单
useEffect(() => {
  if (estimateData) {
    reset({
      title: estimateData.title,
      product: estimateData.product,
      email: estimateData.email,
      manager: estimateData.manager,
      phone_number: estimateData.phone_number,
      content: estimateData.content,
      estimate_require_completion: estimateData.estimate_require_completion,
      memo: estimateData.memo,
    });
  }
}, [estimateData, reset]);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 19:39:23