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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 07:18:03