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

使用history.push传递对象出现DataCloneError是否属于浏览器特有问题?

DataCloneError 问题解答

核心疑问回复

该错误不属于浏览器特有问题。Firefox和Chrome的报错差异仅为提示文案不同,底层触发逻辑完全遵循HTML规范中History API的统一限制。

报错原因

调用history.push()传递state参数时,浏览器会通过结构化克隆算法对state数据做序列化处理,该算法本身不支持克隆以下类型的值:

  • 函数(含内置原生函数)
  • Symbol类型
  • DOM节点对象
  • 存在循环引用的对象
  • 部分特殊内置对象(如Error、Function构造器等)

你从ProfileContext拿到的profile对象内包含函数类型的属性,Chrome报错内容已明确指出无法克隆function () { [native code] },因此触发了序列化失败的报错。

修复方案

方案1:仅传递纯数据属性

提取profile中需要用到的纯数据字段,剥离函数等不可克隆内容后再传递:

const gotoEditPage = () => {
  const stateProfile = {
    // 仅保留需要的纯数据属性,不要包含函数
    username: profile.username,
    avatar: profile.avatar,
    bio: profile.bio
  }
  history.push({
    pathname: '/setting',
    state: { profile: stateProfile }
  })
}

方案2:JSON序列化后传递

如果纯数据属性较多,可先转成JSON字符串再传递,目标页面接收后再反序列化即可,注意该方式会丢失函数、undefined、Date、正则等特殊类型的值:

// 跳转前序列化
history.push({
  pathname: '/setting',
  state: { profileStr: JSON.stringify(profile) }
})

// 目标页面解析
const profile = JSON.parse(history.location.state.profileStr)

方案3:通过全局状态存储数据

如果需要完整保留带方法的复杂对象,可直接通过Context、Redux、Zustand等全局状态工具存储profile数据,跳转后直接从全局状态读取,无需通过history.state传递。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 02:12:00