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

使用useNavigate重定向后React useEffect无法获取location状态问题

React useEffect中useLocation的state无断点时为null的问题修复

问题原因

这种情况核心是React Router的state传递时机与组件初始渲染时机不匹配:

  • 从Header导航到SearchView时,组件可能先完成初始挂载,此时React Router还未将导航携带的state注入useLocation(),所以初始state为null。
  • 加断点时代码执行被暂停,给了React Router足够时间完成state同步,因此断点执行时能拿到正确值。

解决方案1:快速判空修复

在useEffect中先判断state是否有效,避免传入null触发错误:

useEffect(() => {
  if (!state) return;
  
  console.log(state);
  getData(state).catch(console.error);
}, [state]);

初始渲染时state为null时会直接跳过API请求,等React Router完成state同步后,useEffect会因state变化再次触发,此时就能正常调用接口。

解决方案2:改用URL查询参数(更可靠)

用state传递数据存在刷新丢失、时机匹配问题等弊端,更推荐将搜索参数放到URL查询参数中,组件挂载时即可同步获取,还能保留搜索状态:

修改Header.tsx的跳转逻辑:

const handleKeyDown = async (event: any) => {
  if (event.key === 'Enter') {
    const searchParams = new URLSearchParams();
    if (searchTitle) searchParams.set('title', searchTitle);
    // 其他参数如价格区间可按同样方式添加
    // if (priceFrom) searchParams.set('priceFrom', priceFrom.toString());
    
    navigate(`${ApplicationRoutes.SearchRoute}?${searchParams.toString()}`);
  }
}

修改SearchView.tsx的参数获取逻辑:

import { useSearchParams } from 'react-router-dom';

export const SearchView = () => {
  const [items, setItems] = useState<SellItemModel[]>();
  const [searchParams] = useSearchParams();

  const getData = async (params: SearchModel) => {
    const result = await SearchItemService.SearchByParams(params);
    setItems(result);
  }

  useEffect(() => {
    const params: SearchModel = {
      title: searchParams.get('title') || '',
      priceFrom: searchParams.get('priceFrom') ? Number(searchParams.get('priceFrom')) : null,
      priceUntil: searchParams.get('priceUntil') ? Number(searchParams.get('priceUntil')) : null,
      getCount: null,
      skipCount: null
    };
    
    getData(params).catch(console.error);
  }, [searchParams]);

  // ...
}

这种方式不仅解决了当前的state时机问题,还能让用户刷新页面后保留搜索条件,体验更完善。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 08:25:21