React Router

参考:http://www.ruanyifeng.com/blog/2016/05/react_router.html

概念:

路由库是通过管理 URL,实现  “组件”  的切换和状态的变化。关键词是“组件”间。

要完成路由,需要Router 和 Route 两个组件。其中Router组件本身只是一个容器,真正的路由要通过Route组件定义

安装

   npm install -S react-router

引用

   import { Router, Route, hashHistory } from 'react-router';

路由

  <Router history={hashHistory}> 
        <Route path="/" component={App}/> 
        <Route path="/repos" component={Repos}/> 
        <Route path="/about" component={About}/>
  </Router>

  这句的意思是:
            访问根路径/ 跳转到 APP组件
            访问/repos  跳转到Repos组件
            访问/about  跳转到About组件
  这个有点像java spring 框架中的controller层的路由
  http://localhost:8080/#/repos


  嵌套写法:
  <Router history={hashHistory}> 
        /*嵌套部分*/
        <Route path="/" component={App}> 
              <Route path="/repos" component={Repos}/> 
              <Route path="/about" component={About}/> 
        </Route>
  </Router>

  /*APP.js*/
  /*App组件的this.props.children属性就是子组件*/
  export default React.createClass({ 
          render() { 
                  return <div> {this.props.children} </div> 
          }
  })

  =======================================
  /*换种写法*/
  let routes = <Route path="/" component={App}> 
               <Route path="/repos" component={Repos}/>         
               <Route path="/about" component={About}/>              
               </Route>;

   <Router routes={routes} history={browserHistory}/>

Path

   <Route path="inbox" component={Inbox}> 
       <Route path="messages/:id" component={Message} />
   </Route>

   访问/inbox/messages/:id时,会加载
         <Inbox> 
              <Message/>
         </Inbox>

    1.path的配置的通配符:

      :paramName匹配URL的一个部分,直到遇到下一个/、?、#为止。
      这个路径参数可以通过this.props.params.paramName取出。

      <Route path="/hello/:name">
      // 匹配 /hello/michael
      // 匹配 /hello/ryan

      ()表示URL的这个部分是可选的

      <Route path="/hello(/:name)">
      // 匹配 /hello
      // 匹配 /hello/michael
      // 匹配 /hello/ryan

      *匹配任意字符,直到模式里面的下一个字符为止。匹配方式是非贪婪模式

      <Route path="/files/*.*"> 
      // 匹配 /files/hello.jpg
      // 匹配 /files/hello.html

      <Route path="/files/*">
      // 匹配 /files/ 
      // 匹配 /files/a
      // 匹配 /files/a/b

      **匹配任意字符,直到下一个/、?、#为止。匹配方式是贪婪模式

      <Route path="/**/*.jpg">
      // 匹配 /files/hello.jpg
      // 匹配 /files/path/to/file.jpg

   2.注意事项
      <Router> 
            <Route path="/:userName/:id" component={UserPage}/> 
            <Route path="/about/me" component={About}/>  
      </Router>

      用户访问/about/me时,不会触发第二个路由规则,因为它会匹配/:userName/:id这个规则。因此,带参数的路径一般要写在路由规则的底部。

   3.IndexRoute
      把IndexRoute想象成某个路径的index.html,IndexRoute组件没有路径参数path。
      <Router> 
          <Route path="/" component={App}> 
              <IndexRoute component={Home}/> 
              <Route path="accounts" component={Accounts}/> 
              <Route path="statements" component={Statements}/> 
          </Route>
      </Router>

Redirect

   <Redirect>组件用于路由的跳转,即用户访问一个路由,会自动跳转到另一个路由。
   <IndexRedirect>组件用于访问根路由的时候,将用户重定向到某个子组件。

     <Route path="/" component={App}> 
          <IndexRedirect to="/welcome" /> 

          {/* 从 /inbox/messages/:id 跳转到 /messages/:id */} 
          <Redirect from="messages/:id" to="/messages/:id" />

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

Link

    Link组件用于取代<a>元素,生成一个链接,允许用户点击后跳转到另一个路由。它基本上就是<a>元素的React 版本,可以接收Router的状态。
    IndexLink组件使用路径的精确匹配。

    render() { 
            return <div> 
                      <ul role="nav"> 
                        <li><Link to="/about" activeStyle={{color: 'red'}}>About</Link></li> 
                        <li><Link to="/repos" activeStyle={{color: 'red'}}>Repos</Link></li>
                      </ul> 
                   </div>
     }

     如果链接到根路由/,不要使用Link组件,而要使用IndexLink组件。这是因为,
     对于根路由来说,activeStyle和activeClassName会失效,或者说总是生效,因为/会匹配任何子路由。
     而IndexLink组件会使用路径的精确匹配。

     <IndexLink to="/" activeClassName="active">
      Home
     </IndexLink>

     同样的,onlyActiveOnIndex属性也能实现同样效果
     <Link to="/" activeClassName="active"  onlyActiveOnIndex={true} > 
     Home
     </Link>

History

    Router组件的history属性,用来监听浏览器地址栏的变化,并将URL解析成一个地址对象,供 React Router 匹配。
    属性value:
          browserHistory
          hashHistory
          createMemoryHistory

表单

  <form onSubmit={this.handleSubmit}> 
        <input type="text" placeholder="userName"/> 
        <input type="text" placeholder="repo"/> 
        <button type="submit">Go</button>
  </form>


  import { browserHistory } from 'react-router'
  // ... 
  handleSubmit(event) { 
            event.preventDefault() 
            const userName = event.target.elements[0].value 
            const repo = event.target.elements[1].value 
            const path = `/repos/${userName}/${repo}`      
            在Router组件之外,导航到路由页面,可以使用浏览器的
            History API,像下面这样写       
            browserHistory.push(path)
   },
    ... ... 

路由的钩子

  每个路由都有Enter和Leave钩子,用户进入或离开该路由时触发。

  <Route path="about" component={About} />
  <Route path="inbox" component={Inbox}> 
          <Redirect from="messages/:id" to="/messages/:id" />
  </Route>

  上面的代码中,如果用户离开/messages/:id,进入/about时,会依次触发以下的钩子:
    /messages/:id的onLeave
    /inbox的onLeave
    /about的onEnter
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • Lesson11、首先确保安装了Node.js和npm依赖包管理工具2、在git上克隆官方示例程序 git clo...
    冰_心阅读 2,694评论 0 16
  • React Router 4.0 (以下简称 RR4) 已经正式发布,它遵循React的设计理念,即万物皆组件。所...
    梁相辉阅读 97,318评论 24 195
  • 概述 传统开发中的 路由,是由服务端根据不同的用户请求地址 URL,返回不同内容的页面,而前端路由则将这些任务通过...
    杨慧莉阅读 1,062评论 1 2
  • 春寒惊雷泣声声,天含情,地悲恸。步履匆匆,千人哭送行。正气清风拂两袖,仁孝悌,情义重。 霜鬓不惑说笑声,月当空,独...
    那年五月阅读 373评论 1 2
  • 说起民族唱法,一般人都会认为是各民族或民间的唱法,通俗的说叫“原生态”;了解过的人会知道在音乐学院声乐方向上,有一...
    溪中塵丶阅读 1,405评论 0 1