React-router v4 路由配置方法小结

一. Switch 、Router 、Route三者的区别

1、Route

Route 是建立location 和 ui的最直接联系

2、Router

react-router v4 中,Router被拆分成了StaticRouter、MemoryRouter、BrowserRouter、HashRouter、NativeRouter。

MemoryRouter、BrowserRouter、HashRouter 等于

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import { Router } from 'react-router'
<!--这里可以有三种-->
<!--history 部分源码
exports.createBrowserHistory = _createBrowserHistory3. default ;
exports.createHashHistory = _createHashHistory3. default ;
exports.createMemoryHistory = _createMemoryHistory3. default ;
-->
import createBrowserHistory from 'history/createBrowserHistory'
//
const history = createBrowserHistory()
 
<Router history={history}>
  <App/>
</Router>

NativeRouter(给rn使用的)

A <Router> for iOS and Android apps built using React Native.

这里新增strict 和 exact

使用了strict location 大于等于path才能匹配,eq path='/one' location='/one/a'能匹配。

使用了exact location 约等于 path 才能匹配,eq path='/one' location='/one'或者 '/one/'能匹配,所以说是约等于。

使用了exact 和 strict location = path才能匹配

StaticRouter(后续补充)

3、Switch

这是v4版本中新添加,主要用来做唯一匹配的功能。就是想要在众多路由中只匹配其中一个路由。

二、v4 版本中路由应该如何配置呢?

1.基本配置(这个和v3中基本一致,效果也基本一样)

匹配 <= location eq.( /b => / + /b ) ( / => / )

?
1
2
3
4
5
6
<BrowserRouter forceRefresh={!supportsHistory} keyLength={12}>
   <div>
     <Route path= "/" component={aContainer} />
     <Route path= "/b" component={bContainer} />
   </div>
  </BrowserRouter>

2.含Switch 配置

匹配 <= location eq.( /b => /b ) ( / => / ) 唯一匹配

?
1
2
3
4
5
6
7
<BrowserRouter forceRefresh={!supportsHistory} keyLength={12}>
   <Switch>
       //这里用exact,仅仅是担心location被 path='/'截胡了。
     <Route exact path= "/" component={aContainer} />
     <Route path= "/b" component={bContainer} />
   </Switch>
  </BrowserRouter>

问题(三个问题)

1.如何设置公共的Component

第一种方式

?
1
2
3
4
5
6
<BrowserRouter forceRefresh={!supportsHistory} keyLength={12}>
   <div>
     <Route path= "/" component={aContainer} />
     <Route path= "/b" component={bContainer} />
   </div>
  </BrowserRouter>

第二种方式(父子嵌套)

?
1
2
3
4
5
6
7
<BrowserRouter forceRefresh={!supportsHistory} keyLength={12}>
   <div >
    <Route path= "/" component={aContainer} />
    <Route path= "/b" component={Parent} />
    { /* {app()} */ }
   </div>
  </BrowserRouter>
?
1
2
3
4
5
6
7
const Parent = ({ match }) => (
  <div>
   <Route path={`${match.url}/`} component={bContainer} />
   <Route path={`${match.url}/c`} component={cContainer} />
   <Route path={`${match.url}/d`} component={dContainer} />
  </div>
);

这种情况 bContainer就是是公用的Component

2.如何设置getComponent,按需加载

另一篇文章 

3.是否有简化写法

?
1
npm install --save react-router-config

第一步 配置路由

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const routes = [
  { component: bContainer,
   routes: [
    { path: '/' ,
     exact: true ,
     component: bContainer
    },
    { path: '/b/b' ,
     component: bContainer,
     routes: [
      { path: '/b/b/b' ,
       component: bContainer
      }
     ]
    }
   ]
  }
]

第二步 设置路由

?
1
2
3
4
5
<BrowserRouter forceRefresh={!supportsHistory} keyLength={12}>
    <div >
      {renderRoutes(routes)}
    </div>
  </BrowserRouter>

第三步 需要在container的render中去调用方法

?
1
2
3
4
<div>
  1111
  {renderRoutes( this .props.route.routes)}
</div>

这个优势是可以统一配置,劣势是需要在container中统一调用,但是这个抽出来统一实现,问题也不大,并且还可以解决 问题一。

这个renderRoutes实际是就是用一层Switch和多个Route来包了一层。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丶乘风破浪丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值