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

使用useHistory传递多词字符串时,history.push的state变为undefined

问题解决方案

一、state传递失效(含空格字符串变成undefined)

你的代码存在两个关键问题:

  • setState是异步操作:调用setValue(event.target.value)后,组件state不会立刻更新,此时history.push里的value还是更新前的旧值(比如初始空字符串),导致带空格的字符串无法正确传入state。
  • URL搜索参数未编码:含空格的字符串直接拼入search会导致URL格式非法,可能干扰路由对state的解析。

修复代码

修改第一个组件的onKeyPress函数:

const onKeyPress = event => {
  if (event.key === "Enter" && event.target.value.length > 0) {
    const inputValue = event.target.value; // 直接获取输入值,避开异步state更新
    setValue(inputValue);
    event.preventDefault();
    history.push({
      pathname: "/home/Search",
      search: `SearchText=${encodeURIComponent(inputValue)}`, // 对参数进行URL编码
      state: { value: inputValue }
    })
  }
}

二、useEffect执行两次

这是React 18开发环境下的严格模式行为,严格模式会主动触发两次副作用(包括useEffect),用于检测组件中可能存在的挂载/卸载逻辑问题,生产环境下不会出现该现象。

如果需要在开发环境临时规避,可以移除根组件的<React.StrictMode>包裹,但更推荐让你的副作用逻辑保持幂等(执行多次也不会产生错误),适配严格模式的检测机制。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 00:30:44