【发布时间】:2021-05-15 05:39:53
【问题描述】:
我这几天一直在尝试解决这个问题,但仍然无法正常工作。重定向如何在这里不起作用?我不断收到“TypeError:历史未定义”。此外,当单击按钮时,它会保持在相同的 url。我做错了什么?
import React from 'react';
import Nav from './Nav';
import About from './About';
import Service from './Service';
import Home from './Home';
import {
BrowserRouter as Router,
Switch,
Route,
useHistory,
} from 'react-router-dom';
function App() {
const history = useHistory();
function handleSub() {
// console.log('clicked');
history.push('/about');
}
return (
<div className='App'>
<button onClick={handleSub}>submit</button>
<Router>
<Nav />
<Switch>
<Route path='/' exact component={Home} />
<Route path='/about' component={About} />
<Route path='/service' component={Service} />
</Switch>
</Router>
</div>
);
}
export default App;
编辑:实施了答案,但仍然遇到问题。 建议1:将按钮放置在路由器内部:链接或按钮被点击的url切换,但点击按钮时链接的页面没有。
function App() {
const history = useHistory();
function handleSub() {
// console.log('clicked');
history.push(`/about`);
}
return (
<Router>
<div className='App'>
<Nav />
<button onClick={handleSub}>submit</button>
<Switch>
<Route path='/' exact component={Home} />
<Route path='/about' component={About} />
<Route path='/service' component={Service} />
</Switch>
</div>
</Router>
);
}
建议二:所有链接和按钮的 url 开关,但页面永远不会加载。
function App() {
const history = useHistory();
function handleSub() {
// console.log('clicked');
history.push(`/about`);
}
return (
<Router>
<div className='App'>
<Nav />
<Switch>
<button onClick={handleSub}>submit</button>
<Route path='/' exact component={Home} />
<Route path='/about' component={About} />
<Route path='/service' component={Service} />
</Switch>
</div>
</Router>
);
}
【问题讨论】:
-
您正试图在
Router的上下文之外使用历史记录。路由器必须移动到组件树的更高级别,或者useHistory移动到更低的级别。 -
我相信你的onClick可能也需要更新为
onClick={() => handleSub()} -
@CWSites OP 的处理程序语法很好,添加另一个匿名函数没有任何作用。
-
@lawrence-witt gotcha - 过去我遇到过问题,如果不以这种方式使用它,它会在每次渲染时调用它。也许是我对它的工作原理缺乏了解。
-
@CWSites 如果他们输入了
onClick={handleSub()}这确实是一个常见错误。
标签: javascript reactjs react-router router