如何从 react-router 升级到 react-router-dom?

Posted

技术标签:

【中文标题】如何从 react-router 升级到 react-router-dom?【英文标题】:How to upgrade from react-router to react-router-dom? 【发布时间】:2017-09-26 21:16:56 【问题描述】:

如果我想从"react-router": "^2.0.0" 升级到"react-router": "^4.0.0","react-router-dom": "^4.0.0"。 我的结构应该是这样的:

    主组件:是所有事物的容器组件( 父母)。 导航组件:用于在我的其他子组件之间导航,该组件应始终出现。 子组件:示例、关于、测试。其中 Test 是默认值。

我的旧代码按预期工作是这样的:

-App.jsx

var Route, Router, IndexRoute, hashHistory = require('react-router');

        ReactDOM.render(
          <Router history=hashHistory>
            <Route path="/" component=Main>
              <Route path="about" component=About/>
              <Route path="examples" component=Examples/>
              <IndexRoute component=Test/>
            </Route>
          </Router>,
          document.getElementById('app')
        );

-主要组件是这样的:

var React = require('react');
var Nav = require('Nav');

var Main = (props) => 
  return (
    <div>
      <Nav/>
      props.children
    </div>
  );


module.exports = Main;

-我的导航组件是这样的:

var React = require('react');
var Link, IndexLink = require('react-router');

var Nav = () => 
  return (
    <div>
      <IndexLink to="/" activeClassName="active" activeStyle=fontWeight: 'bold'>Test</IndexLink>
      <Link to="/about" activeClassName="active"  activeStyle=fontWeight: 'bold'>About</Link>
      <Link to="/examples" activeClassName="active" activeStyle=fontWeight: 'bold'>Examples</Link>
    </div>
  );
;

module.exports = Nav;

我尝试这样升级:

-App.jsx

var  BrowserRouter, Route  =require('react-router-dom');

ReactDOM.render(
  <BrowserRouter>
   <div>
       <Route path='/' component=Main />
       <Route path='/Test' component=Test/>
       <Route path='/about' component=About/>
       <Route path='/examples' component=Examples/>
   </div>
  </BrowserRouter>,
  document.getElementById('app')
);

-我的主要组件没有变化

-我的导航组件是这样的:

var React = require('react');
var Link, NavLink =require('react-router-dom');
var Nav = ()=>
  return(
    <div>
    <NavLink activeClassName="active" activeStyle=fontWeight: 'Bold' to="/Test">Test</NavLink>
    <NavLink activeClassName="active" activeStyle=fontWeight: 'Bold' to="/about">About</NavLink>
    <NavLink activeClassName="active" activeStyle=fontWeight: 'Bold' to="/examples">Examples</NavLink>
    </div>
  );


module.exports = Nav;

我面临以下问题:

测试组件不像以前那样默认了。 主组件的行为不像父组件。 在示例中刷新浏览器时,出现以下错误:

http://localhost:5000/examplesnet::ERR_CONNECTION_REFUSED

【问题讨论】:

【参考方案1】:

所以你需要改变你的 App.jsx 模块,所以它只渲染主组件,因为现在你可以把你的路由器移到那里。 React Router v4 不再将其路由渲染到 props 子级。现在你需要在你想要渲染它的特定位置声明它。

App.jsx

ReactDOM.render(
      <Main/>,
      document.getElementById('app')
);

主要组件

var React = require('react');
var Nav = require('Nav');
var  HashRouter, Route, Switch  = require('react-router-dom');

var Main = (props) => 
   return (
     <HashRouter>
        <Nav/>
        <Switch>
           <Route path='/about' component=About/>
           <Route path='/examples' component=Examples/>
           <Route component=Test/>
        </Switch>
     </HashRouter>
   );


module.exports = Main;
所以现在您的 Main 组件可以像父组件一样工作。 如果您删除 Route 组件的路径属性,它将表现得像默认值一样。您也可能注意到我添加了 Switch 组件。它应该确保一个路由被独占渲染。您可以在manual查看详细信息。 以前,您使用 hashHistory 作为路由器,现在您可以使用 HashRouter 来做同样的事情。这应该可以解决您遇到的错误。

【讨论】:

非常感谢,但您已经删除了props.children 孩子们是如何渲染的!?如果我想让孩子居中,我应该在每个子组件(示例、关于和测试)上添加 css 类,还是可以在main 组件中这样做? 现在 Route 是一个常规组件,只要它匹配到路径,它就会被渲染。它不再使用props.children。因此,在 switch 组件中,Route 组件之一将匹配并呈现 attr 中提供的组件。您可以在 Main 中将您的组件居中,只需将您的 Switch 包装为 div 并对其应用 CSS 样式。 非常感谢,请您说明&lt;BrowserRouter&gt;&lt;HashRouter&gt; 之间的区别 BrowserRouter 使用 html5 历史 API,因为您还需要正确配置服务器。当HashRouter 使用 URL 的哈希部分时。例如'/examples' 与 BrowserRouter 和 '/#examples' 与 HashRouter

以上是关于如何从 react-router 升级到 react-router-dom?的主要内容,如果未能解决你的问题,请参考以下文章

React-router v6 该怎么用?

如何从 express 重定向到 react-router?

前端知识 | React-Router路由系统

如何使用链接(react-router)将道具从一个页面传递到类组件

从reach/router切换到react-router时,如何设置basename?

react-router 如何从数组生成路由?