React-router学习笔记

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了React-router学习笔记相关的知识,希望对你有一定的参考价值。

之前看react-router的时候写的笔记,搬过来充数

Router

笔者解读:React Router的组件,可保持UI和URL的同步 看名字的话,react-router大概跟其他语言里面路由的功能和作用是差不多的,差别应该是在用法和形式上面,也就是神一样,形不一样(容我装一下AC之间)。

这好像是一个官方文档上面的例子:

import React from ‘react‘
import{ render } from ‘react-dom‘
// 首先我们需要导入一些组件...
import{ Router, Route, Link } from ‘react-router‘
const App = React.createClass({
render(){
return(
    <div>
        <h1>App</h1>
        {/* 把 <a> 变成 <Link> */}
        <ul>
            <li><Link to="/about">About</Link></li>
            <li><Link to="/inbox">Inbox</Link></li>
        </ul>
        {/*
          接着用 `this.props.children` 替换 `<Child>`
          router 会帮我们找到这个 children
        */}
        {this.props.children}
    </div>)
}})
// 最后,我们用一些 <Route> 来渲染 <Router>。
// 这些就是路由提供的我们想要的东西。
React.render(
(
<Router>
    <Route path="/" component={App}>
    <Route path="about" component={About}/>
    <Route path="inbox" component={Inbox}/></Route>
</Router>), document.body)

 react-router会为我们搭建嵌套UI eg: 当路径是/about时,react-router会搭建出

 <App> <About /> </App>

这样的东东。

在Inbox内部嵌套Message,是的还是一个贴过来的例子:

 

// 新建一个组件让其在 Inbox 内部渲染
const Message = React.createClass({
  render() {
    return <h3>Message</h3>
  }
})

const Inbox = React.createClass({
  render() {
    return (
      <div>
        <h2>Inbox</h2>
        {/* 渲染这个 child 路由组件 */}
        {this.props.children || "Welcome to your Inbox"}
      </div>
    )
  }
})

React.render((
  <Router>
    <Route path="/" component={App}>
      <Route path="about" component={About} />
      <Route path="inbox" component={Inbox}>
        {/* 添加一个路由,嵌套进我们想要嵌套的 UI 里 */}
        <Route path="messages/:id" component={Message} />
      </Route>
    </Route>
  </Router>
), document.body)

Router与Route一样都是react的组件 Route的path属性表示路由组件对应的路径,可以是绝对路径也可以是相对路径 在Route中可以用component指定单个组件,或者通过components指定多个组件集合 param通过/:param的方式传递(path="messages/:id"),这种写法与express以及ruby on rails一致,符合RestFul规范。

 

获取URL参数

const Message = React.createClass({
    componentDidMount(){
        // 来自于路径 `/inbox/messages/:id`
        const id =this.props.params.id
        fetchMessage(id,function(err, message){
            this.setState({ message: message })
        }
    )},
    // ...
})

还可以用 query 字符串来访问参数。 比如要访问 /foo?bar=baz,

你可以通过访问this.props.location.query.bar 从 Route 组件中获得 "baz" 。

路由配置

其实就是告诉router怎样匹配URL以及匹配完之后怎样去执行代码 例:添加一个默认的首页 URL为/时,

想渲染一个App中的组件,但是这个时候App中render中的子组件也就是this.props.children还是undefined,

这个时候我们就需要用IndexRoute设置默认的页面

<IndexRoute component={Dashboard} />

如果在路径中使用绝对路径就可以做到像这样, /inbox/messages/:id 变成 /messages/:id 但是细心的盆宇会发现,

其实这样做是改变了URL,做出如此不符合规范的行为,就会造成这样的现象,

如果有人访问/inbox/messages/5时就会找不到页面,那么如何补救呢,

这时候Redirect就出现了 Redirect是一个重定向组件,有from和to两个属性 我们可以用Redirect重新定向这个URL。

<Route path="inbox" component={Inbox} >
    <Route path="/messages/:id" component={Message} />
   
     {/*跳转 /inbox/messages/:id 到 /messages/:id */}
    <Redirect from="messages/:id" to="/messages/:id" />
</Route>

进入和离开的Hook Route可以定义onEnter和onLeave两个hook,

hook会在页面跳转确认时触发一次:权限验证或在路由跳转之前将一些数据持久化保存起来 在路由跳转过程中,

onLeave hook 会在所有将离开的路由中触发,从最下层的子路由开始直到最外层父路由结束。

然后onEnter hook会从最外层的父路由开始直到最下层子路由结束。

一个比较通俗易懂的例子, 点击链接,从/messages/5跳转到/about,hook的执行就是下面这个样子:

 /messages/:id 的 onLeave
        /inbox 的 onLeave
        /about的 onEnter

除了上面这种组件一样的方法之外, 路由的配置书写方法还可以这样子,

const routeConfig =[{ path:‘/‘,

  component: App,

  indexRoute:{ component: Dashboard },

  childRoutes:[

    { path:‘about‘,

       component: About },

    { path:‘inbox‘,

      component: Inbox,

      childRoutes:[{

        path:‘/messages/:id‘,

        component: Message

    },

    { path:‘messages/:id‘,

      onEnter:function(nextState, replaceState){

      replaceState(null,‘/messages/‘+ nextState.params.id)}

    }]

  }]

}]

React.render(<Router routes={routeConfig}/>, document.body)

很像写配置文件一样的。

路由匹配原理

路由有三个属性来决定它是否与一个“URL”相匹配

嵌套关系 路径语法 优先级

嵌套关系

官方解释是酱紫的:React-Router 使用路由嵌套的概念来让你定义 view 的嵌套集合,当一个给定的 URL 被调用时,整个集合中(命中的部分)都会被渲染。嵌套路由被描述成一种树形结构。React Router 会深度优先遍历整个路由配置来寻找一个与给定的 URL 相匹配的路由。 就是说,react-router的路由是使用一种组件相互嵌套的方式定义的,这个跟react-redux里面组件的结构也很一致

路径语法:

路由路径是匹配一个(或一部分)URL的一个字符串模式。

:paramName 匹配一段位于/,?或# 之后的URL。

命中的部分将被作为一个参数 () 在它内部的内容被认为是可选的 * 匹配任意字符(非贪婪的)直到命中下一个自负或者整个URL的末尾,并创建一个splat参数

 

<Route path="/hello/:name">// 匹配 /hello/michael 和 /hello/ryan
<Route path="/hello(/:name)">// 匹配 /hello, /hello/michael 和 /hello/ryan
<Route path="/files/*.*">// 匹配 /files/hello.jpg 和 /files/path/to/hello.jpg

优先级

路由算法会根据定义的顺序自顶向下匹配路由,

因此,当你拥有两个兄弟路由节点配置时,你必须确认前一个路由不会匹配后一个路由中的路径。

例如,千万不要这么做:

<Route path="/comments".../>
<Redirect from="/comments".../>

这样的话,前面配好的路由就会被重定向。

 

未完待续。。。

 

以上是关于React-router学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

react-router 学习笔记

react-router 4.0 学习笔记

react-router学习笔记

react-router学习笔记

react-router 4.0版本使用笔记

React 学习笔记总结