#reactjs #react-router-dom
#reactjs #react-router-dom
Вопрос:
Я хочу перенаправить на страницу продукта после успешного входа в систему, но я получаю ошибки, ни одно из решений, которые я искал, похоже, не работает. Я уже пробовал useHistory, Redirect, withRouter и т. Д. Версия маршрутизатора: «react-router-dom»: «^ 5.1.2», и я использую webPack для тестирования. Вот следующие файлы:
Routes.js //весь импорт выполнен
<BrowserRouter>
<div>
<NavBar/>
<Switch>
<Route path="/" component={Home} exact={true}/>
<Route path="/ChangeContext" component={ChangeContext}/>
<Route path="/Products" component={Products}/>
<Route path="/Login" component={Login}/>
<Route path="/NotFound" component={NotFound}/>
</Switch>
</div>
</BrowserRouter>
Панель навигации
<header>
<NavLink to="/" activeClassName="is-active" exact={true}>Home amp;nbsp;</NavLink>
<NavLink to="/Products" activeClassName="is-active" >Products amp;nbsp;</NavLink>
<NavLink to="/Login" activeClassName="is-active" >Login amp;nbsp;</NavLink>
<br></br>
</header>
Login.js
import { useHistory } from "react-router-dom";
const Login=()=>{
const history = useHistory();
const handleSubmit=e=>{
e.preventDefault();
let username=e.target.username.value;
let password=e.target.password.value;
let uname=localStorage.getItem("username");
let pwd=localStorage.getItem("password")
if((username===uname amp;amp; password===pwd)amp;amp;(uname!="" amp;amp; pwd!="")){
history.push("/Products");
}
else{
console.log("Try Again!",uname)
}
Я получаю следующую ошибку:
Uncaught TypeError: (0 , _reactRouterDom.useHistory) is not a function
at Login (Login.js?d1d6:8)
at renderWithHooks (react-dom.development.js?cada:14985)
at mountIndeterminateComponent (react-dom.development.js?cada:17811)
at beginWork (react-dom.development.js?cada:19049)
at HTMLUnknownElement.callCallback (react-dom.development.js?cada:3945)
at Object.invokeGuardedCallbackDev (react-dom.development.js?cada:3994)
at invokeGuardedCallback (react-dom.development.js?cada:4056)
at beginWork$1 (react-dom.development.js?cada:23964)
at performUnitOfWork (react-dom.development.js?cada:22779)
at workLoopSync (react-dom.development.js?cada:22707)
Комментарии:
1. Откуда вы импортируете перехват useHistory?
2. Тогда у вас проблема, у вас установлена неправильная версия пакета.
3. попробуйте удалить папку node_modules и файл package-lock.json, а затем запустите npm install
4. Просто запустите
npm install
, вам нужно только удалить node_modules или файл блокировки в качестве последнего средства, если это не сработает, но должно.npm update
также будет работать и обновит все пакеты до самых последних версий, разрешенных вашим package.json5. Спасибо @Nacho Zullo за вашу помощь!
Ответ №1:
Вам не нужно импортировать {useHistory}
.
Просто сохраните props
в качестве параметра в функции основного компонента, а затем используйте props.history.push('/Products')
.
Вы также можете сделать window.href.location="/Products"
, но это приведет к перезагрузке страницы.
Комментарии:
1. Это может быть правдой, но это просто позволяет избежать проблемы. Им необходимо исправить проблему с зависимостями.
2. да, это правда, но для тех, кто нуждается в немедленном исправлении, может использовать это.
Ответ №2:
//History.js
import { createBrowserHistory } from 'history';
export default createBrowserHistory();
//your component
import History from './History';
History.push('Products')
Комментарии:
1. Это такой неправильный ответ. OP предполагает использовать
useHistory
hook fromreact-router-dom
для работы с историей. Нет необходимости изобретать велосипед, просто повторно используйте один раз написанный.