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

React表单onSubmit绑定函数未执行 无法实现自定义路径跳转怎么办

问题原因

  • 未阻止表单默认提交行为:浏览器对form标签的默认提交逻辑就是刷新页面、将表单内的输入字段作为GET参数拼接在URL后,这是你当前出现?query=Mike的直接原因。
  • onSubmit事件绑定错误:你写的onSubmit={(e) => e.handleSubmit()}是尝试从原生事件对象e上调用handleSubmit方法,而该方法是你在组件内自定义的,不是事件对象的属性,所以自定义提交逻辑永远不会触发。
  • useState初始值类型不匹配:你将存储输入字符串的query初始值设为了空数组[],虽然后续赋值字符串不会直接崩溃,但属于不必要的类型错误,建议改为空字符串''。
  • React组件命名不规范:自定义组件首字母必须大写,否则React会将其识别为原生HTML标签,引发潜在问题。

修复后的代码(适配React Router v5及以下版本)

import { useState } from 'react';

// 组件名首字母改为大写
function Search({ history }) {
  // 初始值改为空字符串
  const [query, setQuery] = useState('');

  const handleSubmit = (e) => {
    // 阻止表单默认提交行为
    e.preventDefault();
    // 增加非空判断避免跳转到空路径
    if (query.trim()) {
      history.push(`/${query.trim()}`);
    }
  };

  // 去掉不必要的高阶函数封装,直接处理输入事件
  const handleChange = (e) => {
    setQuery(e.target.value);
  };

  return (
    <>
      <form
        {/* 直接绑定自定义的handleSubmit方法 */}
        onSubmit={handleSubmit}
        className=""
      >
        <div className="">
          <span className="">
            <i className="fas fa-search"></i>
          </span>
          <input
            onChange={handleChange}
            type="text"
            name="query"
            className=""
          />
        </div>
        <button type="submit">Search</button>
      </form>
    </>
  );
}

适配React Router v6+版本说明

如果你使用的是v6及以上版本的React Router,已经不存在history属性,需要替换为useNavigate钩子:

import { useState } from 'react';
import { useNavigate } from 'react-router-dom';

function Search() {
  const [query, setQuery] = useState('');
  // 调用useNavigate钩子获取跳转方法
  const navigate = useNavigate();

  const handleSubmit = (e) => {
    e.preventDefault();
    if (query.trim()) {
      navigate(`/${query.trim()}`);
    }
  };

  // 其余代码和上面修复版一致
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 08:54:03