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

时间:2017-04-28 17:10:15

标签: javascript reactjs react-router jsx react-dom

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

  1. 主要组件:是每件事物的容器组件 亲本)。
  2. 导航组件:用于在我的其他子组件之间导航,此组件应始终显示。
  3. 子组件:示例,关于,测试。其中Test是默认值。
  4. 我的旧代码按预期工作是这样的:

    -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/examples net :: ERR_CONNECTION_REFUSED

1 个答案:

答案 0 :(得分:3)

所以你需要更改你的App.jsx模块,所以它只渲染主要组件,因为现在你可以在那里移动你的路由器。 React Router v4不再渲染它到道具儿童的路线。现在,您需要在要呈现它的特定位置声明它。

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;
  • 所以现在你的主要组件可以像父母那样行事。
  • 如果删除Route组件的路径属性,它将表现为默认值。你也可能注意到我添加了Switch组件。它应该确保一条路线是专门渲染的。您可以在manual
  • 中查看详细信息
  • 之前,您已经为您的路由器使用了hashHistory,现在您可以使用HashRouter做同样的事情。这应该可以解决你得到的错误。