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

React Router中使用useNavigate传递对象报错及替代方案咨询

解决React Router传递嵌套对象的几种方法

你遇到的报错是因为createSearchParams只支持扁平化的键值对(符合URLSearchParamsInit类型),没法直接处理包含数组的嵌套对象brc。下面是几种可行的传递方案:

1. 序列化为JSON字符串作为查询参数传递

把对象转成JSON字符串后编码,作为单个查询参数传递,目标组件再解码解析。优点是能完整保留对象结构,缺点是数据会暴露在URL中。

发送方代码:

const goToPosts = () => {
  // 序列化并编码,避免URL特殊字符问题
  const serializedBrc = encodeURIComponent(JSON.stringify(brc));
  navigate({
    pathname: '/posts',
    search: `?brc=${serializedBrc}`,
  });
};

接收方(Posts组件)代码:

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

const Posts = () => {
  const [searchParams] = useSearchParams();
  const brcStr = searchParams.get('brc');
  // 解码并解析回原对象
  const brc = brcStr ? JSON.parse(decodeURIComponent(brcStr)) : null;

  // 后续使用brc对象即可
  return <div>Posts页面</div>;
};

2. 通过路由state传递(推荐用于无需暴露的私密数据)

React Router的navigate方法支持通过state属性携带额外数据,这些数据不会出现在URL中,刷新页面后会丢失(如果没有持久化处理),适合临时传递数据。

发送方代码:

const goToPosts = () => {
  navigate('/posts', {
    state: { brc }
  });
};

接收方(Posts组件)代码:

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

const Posts = () => {
  const location = useLocation();
  // 从state中取出brc,可选链避免undefined报错
  const brc = location.state?.brc;

  // 后续使用brc对象即可
  return <div>Posts页面</div>;
};

3. 扁平化嵌套对象后传递(适合简单结构)

把嵌套对象转成扁平化的键值对,比如将数组元素转为liq[0].index=adc这类格式,再用createSearchParams处理。缺点是复杂结构的对象扁平化和还原会很繁琐。

发送方代码:

// 手动实现扁平化函数
const flattenObject = (obj, prefix = '') => {
  let result = {};
  for (const key in obj) {
    if (Array.isArray(obj[key])) {
      obj[key].forEach((item, index) => {
        Object.assign(result, flattenObject(item, `${prefix}${key}[${index}].`));
      });
    } else if (typeof obj[key] === 'object' && obj[key] !== null) {
      Object.assign(result, flattenObject(obj[key], `${prefix}${key}.`));
    } else {
      result[`${prefix}${key}`] = obj[key];
    }
  }
  return result;
};

const goToPosts = () => {
  const flatBrc = flattenObject(brc);
  navigate({
    pathname: '/posts',
    search: `?${createSearchParams(flatBrc)}`,
  });
};

接收方需要自己编写还原函数,把扁平化的参数重新组装成原对象,仅推荐结构简单的场景使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 23:10:56