React Router v4路由不起作用

Web*_*bbH 13 reactjs react-router react-router-v4

我是相对较新的反应,我正在试图弄清楚如何让React路由器工作.我有一个超级简单的测试应用程序,看起来像这样:

import React from 'react';
import ReactDOM from 'react-dom';

import {BrowserRouter as Router, Route, Switch, IndexRoute, Link} from 'react-router-dom';

const Home = () => <h1><Link to= "/about">Click Me</Link></h1>
const About = () => <h1>About Us</h1>

const Test = () => (
  <Router>
    <Switch>
    <Route path ="/" component = {Home} />
    <Route path ="/about" component = {About} />
    </Switch>
  </Router>
)

ReactDOM.render(<Test />, document.getElementById('app'));
Run Code Online (Sandbox Code Playgroud)

当我运行应用程序时,主组件加载没有任何麻烦,当我点击"点击我"链接时,网址更改为localhost/about,但没有任何反应.如果我点击刷新,我会得到一个"无法获取/关于".显然,我做错了什么,但我无法弄清楚是什么.我也在使用Webpack.

Tod*_*fee 22

你需要使用一个确切的路径,/否则它也会匹配/about.

<Route exact path="/" component={Home} />
Run Code Online (Sandbox Code Playgroud)

正如评论中所提到的,对于这个简单的事情,我建议使用Create React App来确保你的服务器代码和你的webpack设置都是正确的.一旦你使用create-react-app你只需要使用npm安装反应路由器v4包,然后将你的代码放在App.js文件中,它应该工作.对您的代码进行一些小的更改以使其create-react-app可以使用,如下所示:

// App.js
import React from 'react';

import { BrowserRouter as Router, Route, Switch, Link } from 'react-router-dom';

const Home = () => <h1><Link to="/about">Click Me</Link></h1>
const About = () => <h1>About Us</h1>

const App = () => (
  <Router>
    <Switch>
      <Route exact path="/" component={Home} />
      <Route path="/about" component={About} />
    </Switch>
  </Router>
)

export default App;
Run Code Online (Sandbox Code Playgroud)

React Router V4文档中快速入门说明将告诉您与我刚才解释的相同.

  • 嗯,对不起,但我遇到了类似的问题,尽管我添加了精确但仍然无法正常工作 (4认同)

小智 18

如果您从localhost运行,则需要将historyApiFallback:true添加到webpack.config文件中

  • 关于这一点的更多信息将是非常有帮助的! (7认同)
  • 如果使用create-react-app,你如何实现这个?如果您的堆栈部署到公共服务器,这是一个问题吗?我在本地和服务器上都遇到了同样的问题 (5认同)
  • 我没有webpack.config文件。我该怎么办? (3认同)
  • 这需要添加到文档中,我永远不会知道这一点。一直在拉我的头发。 (2认同)

Han*_*bib 9

如果添加exact不能解决问题,我已将其替换为

  <Route exact path="/" component={App} />
  <Route path="/login" component={Login} />
  <Route path="/register" component={Register} />
Run Code Online (Sandbox Code Playgroud)

这个

  <Route exact path="/"> <App /> </Route>
  <Route path="/login"> <Login /> </Route>
  <Route path="/register"> <Register /> </Route>
Run Code Online (Sandbox Code Playgroud)

将组件作为 Route Child 解决了我的页面路由,我希望它也能帮助其他人


Sid*_*mar 7

在使用Switch时,我们需要记住,我们指定的路由是从最具体最通用的。就您而言,您"/"之前已指定"/about"。所以每次react都在寻找"/about"但向下也<Route "/"满足(因为是子路由)所以在“/”之前使用: “/about "/about""/about""/"

这样你也可以省略精确的

import React from 'react';
import ReactDOM from 'react-dom';

import {BrowserRouter as Router, Route, Switch, IndexRoute, Link} from 'react-router-dom';

const Home = () => <h1><Link to= "/about">Click Me</Link></h1>
const About = () => <h1>About Us</h1>

const Test = () => (
  <Router>
    <Switch>
        <Route path ="/about" component = {About} />
        <Route path ="/" component = {Home} />
    </Switch>
  </Router>
)

ReactDOM.render(<Test />, document.getElementById('app'));
Run Code Online (Sandbox Code Playgroud)


小智 5

您还可以通过始终在最后保留默认路由来解决此问题

<Route path ="/about" component = {About} />

<Route path="/" component={Home} /> // 总是在最后

无需输入exact关键字