React路由器更改URL但不查看

MAR*_*n87 46 reactjs react-router

我在更改视图以响应路由时遇到问题.似乎我已经尝试了所有我可以谷歌没有运气.我只想显示用户列表,点击每个用户应导航到详细信息页面.这是路由器:

import React from "react";
import ReactDOM from "react-dom";
import { BrowserRouter } from 'react-router-dom';
import Users from "./components/Users";
import { Router, Route } from "react-router";
import Details from "./components/Details";

ReactDOM.render((
  <BrowserRouter>
    <div>
        <Route path="/" component={Users} />
        <Route path="/details" component={Details} />
    </div>
  </BrowserRouter>
), document.getElementById('app'))
Run Code Online (Sandbox Code Playgroud)

当我使用网址/详细信息时,我的浏览器会导航到该网址,但不会更改视图.任何其他路线抛出404所以它似乎识别路线但不更新.

Shu*_*tri 34

您需要exact为indexRoute 指定属性,否则对于偶数/details路径,它仍将匹配/.也尝试导入Routereact-router-dom

import React from "react";
import ReactDOM from "react-dom";
import { BrowserRouter, Route } from 'react-router-dom';
import Users from "./components/Users";

import Details from "./components/Details";

ReactDOM.render((
  <BrowserRouter>
    <div>
        <Route exact path="/" component={Users} />
        <Route path="/details" component={Details} />
    </div>
  </BrowserRouter>
), document.getElementById('app'))
Run Code Online (Sandbox Code Playgroud)

更新:

您需要做的另一件事是将组件User附加到withRouter.withRouter只有在组件没有收到时才需要使用Router props,

如果您的组件是由路由器呈现的组件的嵌套子级,或者您没有将Router支持传递给它,或者组件根本没有链接到路由器并且从组件呈现为单独的组件,则可能会发生这种情况.路线.

在Users.js中添加

import {withRouter} from 'react-router';

.........
export default withRouter(Users)
Run Code Online (Sandbox Code Playgroud)

DOCS

  • 您可以使用从“react-router-dom”而不是“react-router”导入的“Route”来尝试更新的答案吗 (2认同)

Tho*_*mas 30

React Router v5 不适用于 React 18 StrictMode https://github.com/remix-run/react-router/issues/7870


Rya*_*off 22

我遇到了同样的问题,发现这是因为我有一个嵌套的路由器。一旦我删除了嵌套的路由器,并简单地将我的特定于组件的路由放在一个交换机组件中——问题就得到了解决,而无需使用 withRouter 或进行任何额外的更改。

<Router> // <--Remove nested Router
    <Switch>
      <Route exact path="/workflows" component={ViewWorkflows} />
      <Route path="/workflows/new" component={NewWorkflow} />
    </Switch>
</Router>
Run Code Online (Sandbox Code Playgroud)

Yusufbek 正在描述一个类似的问题。我认为将与组件相关的路由存储在视图级别比将它们全部存储在一个主路由器中要干净得多。在生产应用程序中,这将是太多的路线,无法轻松阅读和调试问题。


Sha*_*han 19

我遇到了同样的问题,但我修复了它。我把主页放在最后。这个对我有用。就像下面一样。

    import React from "react";
    import ReactDOM from "react-dom";
    import { BrowserRouter } from 'react-router-dom';
    import Users from "./components/Users";
    import { Router, Route } from "react-router";
    import Details from "./components/Details";

    ReactDOM.render((
      <BrowserRouter>
        <div>
            <Route path="/details" component={Details} />
            <Route path="/" component={Users} />
        </div>
      </BrowserRouter>
    ), document.getElementById('app'))
Run Code Online (Sandbox Code Playgroud)

  • 使用“exact”属性也可以为您解决这个问题。 (6认同)

Cod*_*nts 16

您只需将组件包装在withRouter中即可.

<Route exact path ="/ mypath"component = { withRouter(MyComponent)} />

这是一个示例App.js文件:

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

要么

您也可以在导出之前将组件包装在withRouter中,但是您必须确保其他一些事情.

...
import { BrowserRouter as Router, Route, Switch, withRouter } from "react-router-dom";
import Home from "./pages/Home";
import Profile from "./pages/Profile";

class App extends Component {
  render() {
    return (
      <Router>
        <Switch>
          <Route exact path="/" component={withRouter(Home)} />
          <Route exact path="/profile" component={withRouter(Profile)} />
        </Switch>
      </Router>
    );
  }
}

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

  • <Route exact path ="/ mypath"component = {withRouter(MyComponent)} />为我工作 (3认同)

Yus*_*bek 12

我有一个类似的问题,但结构不同。我添加了一个可以处理所有路由的路由器,我使用了 Switch 组件来切换视图。但实际上,并没有。仅更改 URL,但未查看。原因是在侧栏组件内部使用的链接组件位于路由器组件外部。(是的,我已经用“withRouter”导出了侧边栏,没有工作)。因此,解决方案是将包含所有 Link 组件的 SideBar 组件移动到我的路由器中。

问题出在我的链接器上,它们在我的路由器之外

<div className="_wrapper">
  <SideBar /> // Holds my all linkers
  <Router>
     <Switch>
       <Route path="/" component={Home} />
       <Route path="/users" component={Users} />
     </Switch>
  </Router>
 </div>
Run Code Online (Sandbox Code Playgroud)

解决方案是将我的链接器移到我的路由器中

<div className="_wrapper">
  <Router>
     <SideBar /> // Holds my all linkers
     <Switch>
       <Route path="/" component={Home} />
       <Route path="/users" component={Users} />
     </Switch>
  </Router>
</div>
Run Code Online (Sandbox Code Playgroud)

  • 太棒了 - 我的确切问题。谢谢 (5认同)
  • 帮助自己让我很开心。我正在尝试使用两个独立的路由器。一个位于导航栏内,另一个位于主体内以容纳该组件。现在,我将所有内容都放在父组件中的同一个路由器中,并且一切都按预期工作。 (4认同)
  • 谢谢!你救了我!! (3认同)
  • 我已经尝试了一切,包括 withRouter,但只有这个解决方案确实有效......一些解释将有助于理解为什么会发生这种情况 (2认同)
  • @Jim我认为react-router使用上下文API,并且`&lt;Router /&gt;`又名`&lt;BrowserRouter /&gt;`为路由匹配器(如`&lt;Route /&gt;`,`&lt;Switch /&gt;`和导航组件)提供上下文`&lt;链接/&gt;`、`&lt;重定向/&gt;`。为了提供相同的上下文,您必须将所有子组件包装在上下文提供程序“&lt;Router /&gt;”中。 (2认同)

Ebu*_*uka 12

根据此问题 react-router-dom 与 React 18 不兼容,因为 BrowserRouter 是 StrictMode 的子级。

所以要解决这个问题。

而不是这个:

<React.StrictMode><BrowserRouter>...</BrowserRouter></React.StrictMode>
Run Code Online (Sandbox Code Playgroud)

做这个:

<BrowserRouter><React.StrictMode>...</React.StrictMode></BrowserRouter>
Run Code Online (Sandbox Code Playgroud)

这种方式对我有用,我希望它有帮助。

  • 这在“v5.3.1”中对我有用。`v5.3.2` 也修复了这个问题。 (3认同)
  • 经过几个小时的调试,这解决了我的问题(这是由于 v5.3.0)。 (2认同)

Ang*_*var 8

BrowserRouter 无法在您的案例中维护历史记录。改用“路由器”,将此与自定义历史记录一起用作道具可能有助于解决您的问题。

import {Router, Route, Switch, withRouter } from "react-router-dom";
import Home from "./pages/Home";
import Profile from "./pages/Profile";
import {createBrowserHistory} from 'history';

export const customHistory = createBrowserHistory();  //This maintains custom history

class App extends Component {
  render() {
    return (
      <Router history={customHistory}>
        <Switch>
          <Route exact path="/" component={Home} />
          <Route exact path="/profile" component={Profile} />
        </Switch>
      </Router>
    );
  }
}

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

然后在您的组件中,从“App”导入 customHistory 并使用它进行导航。

customHistory.push('/pathname');
Run Code Online (Sandbox Code Playgroud)

希望这有帮助!:)

  • 使用“Switch”时不需要“exact”属性 (2认同)

Kar*_*nga 7

就我而言,我错误地嵌套了两个BrowserRouters。


Bru*_*our 6

当使用Redux时,我遇到类似的问题,其中地址栏中的URL正在更新,但应用程序未加载相应的组件。我能够通过将withRouter添加到导出中来解决:

import { connect } from 'react-redux'
import { withRouter } from 'react-router-dom'

export default withRouter(connect(mapStateToProps)(MyComponentName))
Run Code Online (Sandbox Code Playgroud)


Hom*_*cIs 6

我有同样的问题 react-router-dom 5

问题是由history包引起的。我使用的版本是5.0.0但它们不能一起工作。

在降级固定history4.10.1

相关问题:https : //github.com/ReactTraining/history/issues/804


小智 5

你需要精确添加到索引路线而非封闭的路线由格组件,使用开关从反应路由器-DOM的路线之间切换。

import React from "react";
import ReactDOM from "react-dom";
import { Route, Switch } from 'react-router-dom';
import Users from "./components/Users";

import Details from "./components/Details";

ReactDOM.render((
  <div>
    <Switch>
        <Route path="/" component={Users} exact/>
        <Route path="/details" component={Details} />
    </Switch>
  </div>
), document.getElementById('app'))
Run Code Online (Sandbox Code Playgroud)


小智 5

我尝试在主路径前面添加“exact”,如下所示

<Route exact path="/" component={Home}></Route>

它运行良好...