useSelect Hook的isLoading始终返回false:Next.js地址搜索加载状态问题
问题分析与解决办法
你遇到的queryResult.isLoading始终为false的问题,可从以下几个方向排查:
1. 混淆了react-query的isLoading与isFetching状态
react-query对加载状态做了明确细分:
isLoading:仅在首次发起请求且本地无缓存数据时为true,请求完成后立刻切换为false。isFetching:只要当前有正在进行的请求(包括首次加载、搜索触发的后续请求),就会置为true。
你用debounce:500实现搜索联想,用户输入触发的是后续请求而非首次加载,此时应该通过queryResult.isFetching来判断是否处于加载状态。
2. 请求根本没发起
检查id变量是否有效:如果id是undefined,生成的resource路径会变成addresses/optionaladdresses/board/undefined,无效路径会导致请求无法正常发起,自然不会进入加载状态。可以在组件内打印路径确认:
console.log('resource path:', `addresses/optionaladdresses/board/${id}`);
3. 日志时机不对,没捕获到加载状态
组件顶层的console.log仅在初始渲染时执行一次,而请求的加载状态是异步变化的。等请求进入isLoading状态时,组件会重新渲染,但顶层日志不会再次执行。用useEffect监听状态变化才能准确捕获:
import { useEffect } from 'react'; // ... 其他代码 useEffect(() => { console.log('当前加载状态:', { isLoading: queryResult.isLoading, isFetching: queryResult.isFetching }); }, [queryResult.isLoading, queryResult.isFetching]);
4. 请求完成太快,状态转瞬即逝
如果地址接口响应速度极快,isLoading的状态只会存在极短时间,顶层日志根本来不及捕获。这种情况下,useEffect监听状态变化是更可靠的方式。
内容的提问来源于stack exchange,提问作者Essex Boy
相关产品推荐
相关产品推荐

