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

react-router-dom v6.7.0的useNavigate动态搜索查询失效,如何实现搜索导航?

解决react-router-dom v6.7.0中useNavigate处理搜索查询的异常问题

首先修复代码中的致命拼写错误

你的handleSubmit函数里存在拼写错误:e.prevnetDefault()应该是e.preventDefault(),这个错误会导致表单默认的页面刷新行为无法被阻止,直接让useNavigate的客户端导航逻辑失效。

修正并优化后的SearchBar组件代码

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

function SearchBar() {
    const [searchItem, setSearchItem] = useState("");
    const navigate = useNavigate();

    const handleSubmit = (e) => {
        e.preventDefault(); // 修正拼写错误
        // 用URLSearchParams处理查询参数,自动解决特殊字符编码问题
        const searchParams = new URLSearchParams();
        if (searchItem.trim()) {
            searchParams.set('q', searchItem.trim());
            navigate(`/search?${searchParams.toString()}`);
        }
    };

    return (
        <div className='search-bar'>
            <form onSubmit={handleSubmit}>
                <label htmlFor='search'>Search: </label>
                <input
                    type="text"
                    id="search"
                    value={searchItem} // 绑定value,将输入框设为受控组件
                    onChange={(e) => setSearchItem(e.target.value)}
                />
                <button type="submit">搜索</button> {/* 添加提交按钮,明确交互入口 */}
            </form>
        </div>
    );
}

补充:在/search页面获取搜索参数

如果需要在搜索结果页面读取查询关键词,可以使用useSearchParams钩子:

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

function SearchResult() {
    const [searchParams] = useSearchParams();
    const searchQuery = searchParams.get('q');

    return (
        <div>
            {searchQuery ? (
                <p>搜索关键词:{searchQuery}</p>
            ) : (
                <p>请输入关键词后搜索</p>
            )}
        </div>
    );
}

对应的路由配置可以更新为:

// App.js中的路由配置
{
    path: "/search",
    element: <div><SearchBar /><SearchResult /></div>,
},

内容的提问来源于stack exchange,提问作者R. Mahbub

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 23:25:57