react-router4.x 组件和api介绍

react-router实用4.2.0

react-router很是复杂总体,比vue-router强大不少,好好研究,对你自身能力提升颇有帮助html

  1. 安装vue

    cnpm install react-router --save 包含react router核心
    cnpm install react-router-dom --save 包含react router的dom绑定
  2. BrowserRouterreact

    BrowserRouter是react路由的容器
    相关属性以下
        basename,用来设置路由的基础连接,<BrowserRouter basename="/api" />   
        getUserConfirmation,用来拦截Prompt组件,而且决定是否跳转,我专门作了一个例子
        forceRefresh,用来设置是否强制浏览器总体刷新,默认是false
        keLength,用来设置location.key的长度,默认是6,能够自定义
        注意,BrowserRouter只能有一个子节点
  3. BrowserRouter属性getUserConfirmation的使用例子vue-router

    因为默认是用的window.confirm作验证,很丑,能够本身定义
    使用必须导入Prompt这个组件是用来传递确认信息的
    import React from 'react'
    import ReactDOM from 'react-dom'
    import { Prompt } from 'react-router'
    import {
        BrowserRouter as Router,
        Route,
        Link
    } from 'react-router-dom'
    const MyComponent1 = () => (
        <div>组件一</div>
    )
    const MyComponent2 = () => (
        <div>组件二</div>
    )
    class MyComponent extends React.Component {
        render() {
            const getConfirmation = (message,callback) => {
                const ConFirmComponent = () => (
                    <div>
                        {message}
                        <button onClick={() => {callback(true);ReactDOM.unmountComponentAtNode(document.getElementById('root1'))}}>肯定</button>
                        <button onClick={() => {callback(false);ReactDOM.unmountComponentAtNode(document.getElementById('root1'))}}>取消</button>
                    </div>
                )
                ReactDOM.render(
                    <ConFirmComponent />,
                    document.getElementById('root1')
                )
            }
            return (
                <Router getUserConfirmation={getConfirmation}>
                    <div>
                        <Prompt message="Are you sure you want to leave?" />
                        <Link to="/a">跳转组件二</Link>
                        <Route component={MyComponent1}/>
                        <Route exact path="/a" component={MyComponent2}/>
                    </div>
                </Router>
            )
        }
    }
    ReactDOM.render(
        <MyComponent/>,
        document.getElementById('root')
    )
  4. HashRouter,这个是用来兼容老浏览器的,略
  5. Linknpm

    Link的做用和a标签相似
    属性
        to 
            接受path字符串,<Link to="/a" />
            接受对象
            <Link to={{
                pathname: '/courses',  // 传递的pathname
                search: '?sort=name',  // 传递的url参数
                hash: '#the-hash', // 在url参数后面的hash值
                state: { fromDashboard: true } // 自定义属性存在location中
            }}/>
        replace,设置为true,会取代当前历史记录
  6. NavLinkredux

    NavLink和Link同样最终都是渲染成a标签,NavLink能够给这个a标签添加额外的属性
    <NavLink to="/a">组件一</NavLink> 当点击此路由,a标签默认添加一个名为active的class
    属性
        activeClassName 用于自定义激活a标签的class
        activeStyle 用于设置激活a标签的样式 
            activeStyle={{
                fontWeight: 'bold',
                color: 'red'
            }}
        exact,当路径百分百匹配的时候才展现样式和class,可是不影响路由的匹配,"/a"和"/a/" 是相等的
        strict,这个比exact还很,就算 "/a"和"/a/" 也是不相等的
        isActive,此属性接收一个回调函数,用来作跳转的最后拦截
            <NavLink isActive={oddEvent} to="/a/123">组件一</NavLink>
            const oddEvent = (match, location) => {
                console.log(match,location)
                if (!match) {
                    return false
                }
                console.log(match.id)
                return true
            }
            match里面保存了路由匹配信息的参数,是动态化的
            location里面保存的Link中的to传递的全部信息
        location,此参数用来接受一个location对象,若是对象信息和当前的location信息对象匹配则跳转
            <NavLink to="/a/123" location={{key:"mb5wu3",pathname:"/a/123"}}/>
  7. Prompt后端

    Prompt是用来提示用户是否要跳转,给用户提示信息默认使用window.confirm,能够结合getUserConfirmation构建自定义提示信息
    import { Prompt } from 'react-router'
    属性
        message
            传递字符串,用于提示用户的展现信息
            传递函数,能够接受location对象做为参数
                <Prompt message={location => {
                    console.log(location);
                    return true
                }}/>
                return true表示能够直接跳转,无需验证
                return '你好'表示要给提示给用户的信息
        when,接受一个布尔值,表示是否执行prompt
  8. MemoryRouterapi

    主要用于native端,路由历史不经过URL缓存,而是保存在内存中
    也就是说,地址栏地址不变,而在内存中保存路由信息,当浏览器刷新时,自动跳回路由首页
    仍是能够经过访问location对象获得路由信息
    import { MemoryRouter } from 'react-router'
    属性
        initialEntries 一个数组用来传递路由的初始匹配值
            <MemoryRouter initialEntries={["/a","/b"]}>...</MemoryRouter>
            数组成员能够是字符串也能够是location对象,成员的默认顺序是最左边的展现出来
        initialIndex 用来肯定initialEntries数组展现路由的索引
            <MemoryRouter initialIndex={1} initialEntries={["/a","/b"]}>...</MemoryRouter>
        getUserConfirmation 和上面讲的同样
        keyLength 也是用来设置location.key的长度的
  9. Redirect数组

    路由重定向
    import { Redirect } from 'react-router'
    使用这个 <Redirect to="/a" /> 代替组件使用
    属性
        to
            字符串,要重定向的路径
            对象,location对象
        push,布尔值,是否将当前路径存到history中(是Link标签的to路径)
        from,用来指定路由的原始值,若是不是给定的字符串,那么不渲染,反之渲染,只能用于switch组件中
  10. Route浏览器

    Route的做用就是用来渲染路由匹配的组件
    路由渲染有三种方式,每一种方式均可以传递match,location,history对象
        component
            用来渲染组件
            <Route path="/a" component={MyComponent1}></Route>
        render  
            用来渲染函数式组件,能够防止重复渲染组件
            <Route path="/b" render={({match,location,history}) => {
                console.log(match,location,history);
                return <div>组件二</div>
            }}></Route>
        children
            和render差很少,不过能够用来动态的展现组件
            差异之处在于,children会在路径不匹配的时候也调用回调从而渲染函数,而render只会在路径匹配的时候触发回调
            <Route path="/b" children={({match,location,history}) => {
                return (
                    match ? <div>组件二</div>:<div>组件二二</div>
                )
            }}></Route>
    属性
        path,字符串,匹配的路径
        exact,布尔值,路径彻底匹配的时候跳转 "/a/"和"/a"是同样的
        strict,布尔值,单独使用和没有使用这个属性没有任何区别,若是和exact一块儿使用能够构建更为精确的匹配模式。"/a/"和"/a"是不一样的
        location,传递route对象,和当前的route对象对比,若是匹配则跳转,若是不匹配则不跳转。另外,若是route包含在swicth组件中,若是route的location和switch的location匹配,那么route的location会被switch的location替代
  11. Router

    低级路由,适用于任何路由组件,主要和redux深度集成,使用必须配合history对象
    使用Router路由的目的是和状态管理库如redux中的history同步对接
    关于history插件的使用请看 http://www.cnblogs.com/ye-hcj/p/7741742.html
    import { Router } from 'react-router'
    import { createBrowserHistory } from 'history/createBrowserHistory'
    const history = createBrowserHistory();
    <Router history={history}>
        ...
    </Router>
  12. StaticRouter,静态路由,主要用于服务端渲染,暂不涉及
  13. Switch

    Switch组件内部能够是Route或者Redirect,只会渲染第一个匹配的元素
    属性
        location
            Switch能够传递一个location对象,路由匹配将和这个location对象进行比较,而不是url
            Route元素会比较path,Redirect会比较from,若是他们没有对应的属性,那么就直接匹配
  14. history

    这里的history对象是使用history插件生成的,http://www.cnblogs.com/ye-hcj/p/7741742.html已经详细讲过了
    记住一点,再使用location作对比的使用,经过history访问的location是动态变化的,最好经过Route访问location
  15. location

    location对象表示当前的路由位置信息,主要包含以下属性
    {
        hash: undefined,
        key: "k9r4i3",
        pathname: "/c",
        state: undefined,
        search: ""
    }
  16. match

    match对象表示当前的路由地址是怎么跳转过来的,包含的属性以下
    {
        isExact: true, // 表示匹配到当前路径是不是彻底匹配
        params: {}, // 表示路径的动态参数值
        path: '/c', // 匹配到的原始路径
        url: '/c' // 匹配到的实际路径
    }
  17. matchPath

    matchPath也是和后端相关的,主要做用就是生成一个match对象
    import { matchPath } from 'react-router'
    const match = matchPath('/a/123',{
        path: '/a/:id',
        exact: true,
        strict: false
    })
    第一个参数是pathname
    第二个参数是一个对象,里面的属性和route的属性相似,用来和pathname作对比
    若是匹配的话,就产生一个match对象,反之,null
  18. withRouter

    当一个非路由组件也想访问到当前路由的match,location,history对象,那么withRouter将是一个很是好的选择
    import { withRouter } from 'react-router'
    const MyComponent = (props) => {
        const { match, location, history } = this.props
         return (
            <div>{props.location.pathname}</div>
        )
    }
    const FirstTest = withRouter(MyComponent)
相关文章
相关标签/搜索