使用RTK Query时selectFromResult返回值始终为undefined的解决方法问询
根因分析
- 类型不匹配是最高发原因:
useParams()返回的参数全部为字符串类型,若你接口返回的orderId为数字类型,使用全等运算符===会因为类型差异直接返回false,导致筛选结果为undefined。你提到直接打印完整data是正常的,基本可以判定是该问题导致。 - 请求时序问题:首次渲染时RTK Query还未完成接口请求,
data为初始值undefined,此时selectFromResult返回的inquiry暂时为undefined,请求完成后会自动重新计算。
最优解决方案
首先统一匹配两端的变量类型,同时可以补充请求状态的边界处理,优化用户体验。修正后的代码如下:
const { id } = useParams(); const validate = (input = values) => {} const [values, setValues, errors, setErrors, inputChanged] = useForm(initstate, validate) const { inquiry, isLoading, isSuccess } = useGetInquiriesQuery(undefined,{ selectFromResult:({ data, isLoading, isSuccess }) => ({ // 统一转为字符串匹配,兼容数字/字符串两种orderId格式 inquiry: data?.find((i) => String(i.orderId) === String(id)), isLoading, isSuccess }), }) useEffect(()=>{ if(inquiry){ console.log(inquiry) } },[inquiry]) // 可选:添加边界状态处理 if (isLoading) return <div>数据加载中</div> if (isSuccess && !inquiry) return <div>未查询到对应订单信息</div>
可选优化
如果你确认接口返回的orderId均为数字类型,也可以直接将路由id转为数字后匹配:
inquiry: data?.find((i) => i.orderId === Number(id))
注意如果路由id可能为空或者非数字格式,需要额外添加兼容性判断,避免Number转换得到NaN导致匹配失败。
内容的提问来源于stack exchange,提问作者amr ahmed
相关产品推荐
相关产品推荐

