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

React中如何从searchParams获取对象类型参数的键与值?

问题根源

URL查询参数仅支持字符串类型值。如果构造URL时直接传入JS对象作为task参数值,没有做序列化处理,JS会自动调用对象的toString()方法,最终传入参数的实际值就是固定字符串[object Object]。此时接收端拿到的从始至终都是这个字符串,任何后续处理都无法还原原始对象内容。

修复方案

1. 传参端:先序列化对象再传值

拼接URL设置参数时,必须先把待传递的对象转为JSON字符串,再赋值给task参数:

// 传参端示例
import { useNavigate, createSearchParams } from 'react-router-dom';

const navigate = useNavigate();
// 待传递的任务对象
const taskObj = {
  id: 101,
  title: "页面重构",
  owner: "张三",
  status: "处理中"
};

// 跳转时序列化对象
navigate({
  pathname: "/raw-data",
  search: `?${createSearchParams({
    task: JSON.stringify(taskObj)
  })}`
});

2. 接收端:反序列化后遍历渲染

接收参数时先拿到JSON字符串,解析为JS对象后再遍历键值对渲染,同时增加错误容错,避免参数格式异常导致页面崩溃:

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

const ClientRawData = () => {
  const [searchParams] = useSearchParams();
  const taskParam = searchParams.get('task');

  // 解析参数,加异常捕获
  let taskData = null;
  try {
    taskData = taskParam ? JSON.parse(taskParam) : null;
  } catch (err) {
    console.error('task参数格式非法,解析失败', err);
  }

  return (
    <div>
      This is the raw Data: <br />
      <div className='users'>
        {taskData ? (
          Object.entries(taskData).map(([key, value]) => (
            <div className='user' key={key}>
              <span className="key">{key}: </span>
              <span className="value">
                {typeof value === 'object' ? JSON.stringify(value) : value}
              </span>
            </div>
          ))
        ) : (
          <div className="error">未获取到有效task参数</div>
        )}
      </div>
    </div>
  );
};

export default ClientRawData;
之前方案无效的原因
  • 调用JSON.stringify:你拿到的初始值就是"[object Object]"字符串,对字符串做序列化只会得到带转义的字符串结果,无法还原对象
  • 将参数值包裹在数组中:仅改变了值的外层包裹结构,参数本身还是无效字符串,没有实质作用
  • 调用Object.keys/Object.values:传入字符串时,这类方法会把字符串视作类数组对象,返回的是字符串索引位,根本拿不到原始对象的键值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 20:27:28