React js:单击按钮时 React 路由器不重定向
React js: React router not redirecting when button is being clicked
几天来我一直在尝试解决这个问题,但仍然无法正常工作。重定向如何在这里不起作用?我不断收到“类型错误:历史未定义”。此外,单击按钮时,它保持不变 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>
);
}
仅仅是因为你在React Router Switch
组件之外调用了useHistory
钩子,这意味着你应该在所有Switch
子组件中使用这个钩子,否则历史对象是未定义的。我认为最好的方法是将按钮移动到 Home
组件,然后它就会正常工作。
希望这个回答对您有所帮助。
如果你这样使用
<Button color='primary' onClick={handleSub('/about')}>Submit</Button>
在你的方法中这样做。
const handleSub = (path) => async (e) => {
history.push(path)}
希望能解决您的问题。
问题不在于按钮的位置,而是如最初提到的 useHistory
的位置。历史挂钩需要 Router
组件提供的上下文 - 如果您熟悉 useContext
,这里完全一样。您必须在 Router
.
的子组件内调用 useHistory
我将模拟一个 index.js
文件来演示:
// index.js
import React from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter as Router } from 'react-router-dom';
import App from './App';
const rootHtml = (
<Router>
<App />
</Router>
);
ReactDOM.render(rootHtml, document.getElementById('root'));
移除 App
组件中的原始路由器。现在这个顶级路由器在范围内有 App
组件,可以为它提供历史上下文供 useHistory
使用。
几天来我一直在尝试解决这个问题,但仍然无法正常工作。重定向如何在这里不起作用?我不断收到“类型错误:历史未定义”。此外,单击按钮时,它保持不变 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>
);
}
仅仅是因为你在React Router Switch
组件之外调用了useHistory
钩子,这意味着你应该在所有Switch
子组件中使用这个钩子,否则历史对象是未定义的。我认为最好的方法是将按钮移动到 Home
组件,然后它就会正常工作。
希望这个回答对您有所帮助。
如果你这样使用
<Button color='primary' onClick={handleSub('/about')}>Submit</Button>
在你的方法中这样做。
const handleSub = (path) => async (e) => {
history.push(path)}
希望能解决您的问题。
问题不在于按钮的位置,而是如最初提到的 useHistory
的位置。历史挂钩需要 Router
组件提供的上下文 - 如果您熟悉 useContext
,这里完全一样。您必须在 Router
.
useHistory
我将模拟一个 index.js
文件来演示:
// index.js
import React from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter as Router } from 'react-router-dom';
import App from './App';
const rootHtml = (
<Router>
<App />
</Router>
);
ReactDOM.render(rootHtml, document.getElementById('root'));
移除 App
组件中的原始路由器。现在这个顶级路由器在范围内有 App
组件,可以为它提供历史上下文供 useHistory
使用。