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

React 16搜索栏功能实现求助:API数据获取及组件问题排查

React 16 搜索栏功能bug修复方案

核心问题排查与修复

1. 错误访问 navigate.location

useNavigate 返回的是导航函数,没有location属性,必须用 useLocation 获取的 queryString 解析查询参数。

原错误代码:

const queryParams = new URLSearchParams(navigate.location.search).get("search")

修复后:

const queryParams = new URLSearchParams(queryString).get("search")

2. 查询参数格式错误

提交表单时生成的URL参数包含空格,导致 URLSearchParams 无法正确识别 search 键,必须去掉空格。

原错误代码:

navigate({
    search: `search = ${search}`
})

修复后:

navigate({
    search: `search=${search}`
})

3. Header中a标签错误使用to属性

普通HTML的<a>标签不支持to属性,要替换为react-router-dom的<Link>组件,否则点击品牌logo会刷新页面,破坏单页应用路由逻辑。

首先在Header组件导入Link:

import { Link } from "react-router-dom"

然后替换a标签:

<Link to="/">
    <span>AmaKart</span>
    {/* SVG内容保持不变 */}
</Link>

4. 移除冗余的重复SVG图标

SearchBox组件返回的Fragment里有两个完全相同的搜索SVG图标,属于无效代码,直接删除第二个即可。

5. 优化useEffect逻辑(可选)

原useEffect逻辑可以简化,依赖queryString直接解析参数:

useEffect(() => {
    const params = new URLSearchParams(queryString);
    setSearch(params.get("search") || "");
}, [queryString]);

修复后的完整代码

SearchBox组件

import { Fragment, useState, useEffect } from "react"
import { useNavigate, useLocation } from "react-router-dom";

const SearchBox = () => {
    const navigate = useNavigate()
    const { search: queryString } = useLocation()
    const [search, setSearch] = useState("")

    useEffect(() => {
        const params = new URLSearchParams(queryString);
        setSearch(params.get("search") || "");
    }, [queryString])

    const handleInput = e => {
        setSearch(e.target.value)
    }

    const handleFormSubmission = e => {
        e.preventDefault();
        navigate({
            search: `search=${search}`
        })
    }

    return (
        <Fragment>
            <form onSubmit={handleFormSubmission}>
                <input 
                    name="search" 
                    type="text"
                    id="search" 
                    placeholder="Enter product name, category"
                    value={search}
                    onChange={handleInput}
                />
                <button type="submit">
                    <svg xmlns="http://www.w3.org/2000/svg" 
                        className="icon icon-tabler icon-tabler-search" 
                        width="20"
                        height="20" viewBox="0 0 24 24" 
                        strokeWidth="1.5" stroke="white" fill="none"
                        strokeLinecap="round" strokeLinejoin="round">
                        <path stroke="none" d="M0 0h24v24H0z" fill="none" />
                        <circle cx="10" cy="10" r="7" />
                        <line x1="21" y1="21" x2="15" y2="15" />
                    </svg>
                </button>
            </form>
        </Fragment>
    )
}

export default SearchBox

Header组件

import { Link } from "react-router-dom"
import Cart from "../Cart"
import SearchBox from "../UI/Search"

const Header = () => {
    return (
        <header>
            <div className="nav-brand">
                <Link to="/">
                    <span>AmaKart</span>
                    <svg xmlns="http://www.w3.org/2000/svg" 
                        className="icon icon-tabler icon-tabler-shopping-cart" 
                        width="30"
                        height="30" viewBox="0 0 24 24" 
                        strokeWidth="1.5" stroke="white" 
                        fill="none" strokeLinecap="round"
                        strokeLinejoin="round">
                        <path stroke="none" d="M0 0h24v24H0z" fill="none"/>
                        <circle cx="6" cy="19" r="2" />
                        <circle cx="17" cy="19" r="2" />
                        <path d="M17 17h-11v-14h-2" />
                        <path d="M6 5l14 1l-1 7h-13" />
                    </svg>
                </Link>
            </div>
            <div className="searchBox-container">
                <SearchBox/>
            </div>
            <div className="cart-container">
                <Cart/>
            </div>
        </header >
    )
}

export default Header

后续API调用建议

修复上述bug后,可在useEffect中监听queryString变化,当存在搜索关键词时调用API获取数据:

useEffect(() => {
    const params = new URLSearchParams(queryString);
    const searchKeyword = params.get("search");
    setSearch(searchKeyword || "");
    
    // 调用API获取数据
    if (searchKeyword) {
        fetch(`your-api-url?search=${searchKeyword}`)
            .then(res => res.json())
            .then(data => {
                // 处理返回的数据
                console.log(data);
            })
            .catch(err => console.error(err));
    }
}, [queryString]);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 09:25:42