【发布时间】:2022-11-21 12:22:29
【问题描述】:
我有我的搜索组件,它应该传递到标头组件,但我使用的教程是旧的,并且使用的是旧版本的 React。
这是我的 Search.js 组件。
import React, { useState } from 'react'
import { useParams, useNavigate } from 'react-router-dom'
const Search = ({ history }) => {
const [keyword, setKeyword] = useState('');
const searchHandler = (e) => {
e.preventDefault()
if (keyword.trim()) {
history.push(`/search/${keyword}`)
} else {
history.push('/')
}
}
console.log('my keyword', keyword);
return (
<form onSubmit={searchHandler}>
<div className="input-group">
<input
type="text"
id="search_field"
className="form-control"
placeholder="Enter Product Name ..."
onChange={(e) => setKeyword(e.target.value)}
/>
<div className="input-group-append">
<button id="search_btn" className="btn">
<i className="fa fa-search" aria-hidden="true"></i>
</button>
</div>
</div>
</form>
)
}
export default Search
这就是我将它传递到我的 Header.js 组件中的方式
import React, { Fragment } from 'react'
import { Route, Link } from 'react-router-dom'
import { useDispatch, useSelector } from 'react-redux'
import { useAlert } from 'react-alert'
import { logout } from '../../actions/userActions'
import Search from './Search'
import '../../App.css'
const Header = () => {
return (
<Fragment>
<nav className="navbar row">
<div className="col-12 col-md-6 mt-2 mt-md-0">
<Route render={({ history }) => <Search history={history} />} />
</div>
</nav>
</Fragment>
)
}
export default Header
每当我运行代码时,它都会告诉我需要将它包装在 <Routes> 中
我是这样做的
<Routes>
<Route render={({ history }) => <Search history={history} />} />
</Routes>
但是当我像这样包装它时它不会给出任何错误但是搜索栏根本不会显示在我的浏览器标题中
请问渲染这个的正确方法是什么?
我还读到我的 search.js 中的 history.push 已被替换为 useNavigate 所以我尝试更改它以使我的 Search.js 看起来像这样
import React, { useState } from 'react'
import { useParams, useNavigate } from 'react-router-dom'
const Search = ({ }) => {
const [keyword, setKeyword] = useState('');
const navigate = useNavigate();
const searchHandler = (e) => {
e.preventDefault()
if (keyword.trim()) {
navigate(`/search/${keyword}`)
} else {
navigate('/search')
}
}
console.log('my keyword', keyword);
return (
<form onSubmit={searchHandler}>
<div className="input-group">
<input
type="text"
id="search_field"
className="form-control"
placeholder="Enter Product Name ..."
onChange={(e) => setKeyword(e.target.value)}
/>
<div className="input-group-append">
<button id="search_btn" className="btn">
<i className="fa fa-search" aria-hidden="true"></i>
</button>
</div>
</div>
</form>
)
}
export default Search
但我不知道如何在我的Header 组件中正确渲染它
【问题讨论】:
-
您需要将路径设置为
<Route path="/some-path" />。路由器不知道要渲染它。您也不需要使用渲染道具将历史记录传递给<Search />。只需使用useHistory钩子。
标签: javascript html reactjs search react-router