使用react-router-dom做移动端路由 2019-08-12

今天天气很好,赶到公司也是热的汗流浃背...

react-router 与 react-router-dom的关系

react-router-domreact-router为主分支关系,react-router v4之后,分为了几个独立的包

  • react-router React Router 核心
  • react-router-dom 用于 DOM 绑定的 React Router
  • react-router-native 用于 React Native 的 React Router
  • react-router-redux React Router 和 Redux 的集成
  • react-router-config 静态路由配置的小助手

react-router-dom依赖于react-router,大多组件都只是从react-router中引入然后直接导出,不同的就是多了 <Link> <BrowserRouter>组件。所以web应用只需要引入react-router或者react-router-dom一项即可。

主要组件

1. Router

  • <BrowserRouter>
    使用h5 history API( pushState,replaceState和popstate事件),让UI与URL同步。

  • <HashRouter>
    使用URL(即window.location.hash)的哈希部分来保持UI与URL同步。因为其history不支持location.key或location.state,推荐使用<BrowserRouter>代替。

  • <MemoryRouter>
    在内存中维护history中的“URL”,不读取或写入到地址栏。在测试和非浏览器环境(如React Native)中很有用。

  • <NativeRouter>
    适用于React Native的一个路由器

  • <StaticRouter>
    不可改变其location的一个Router,主要适用于服务器渲染。

2. Switch

保证只渲染第一个匹配location的组件,上代码

<Route path="/about" component={About}/>
<Route path="/:user" component={User}/>
<Route component={NoMatch}/>

上述Route节点,如果访问/about路径,则About,User,NoMatch三个组件都将被渲染,因为三个path都被匹配成功,可能这并不是你想要的结果。如果包裹Switch组件,则只会渲染第一个匹配的组件About

<Switch>
  <Route path="/about" component={About}/>
  <Route path="/:user" component={User}/>
  <Route component={NoMatch}/>
</Switch>

3. Route

负责location匹配及组件渲染的组件,通常作为Switch或者Router子组件。参数包括exact ,path, component, render, children,三个渲染方法中(component, render, children)只能选择一个,大多数情况都只是使用component就够了。

4. Link

一个文本导航组件,跟<a>标签有点类似,不过是路由跳转。

<Link to="/about">About</Link>

点击About就会直接跳到/about路径。

< NavLink >一个特殊版本<Link>,它将在与当前URL匹配时为渲染元素添加样式属性。

直接传入className

<NavLink to="/faq" activeClassName="selected">
  FAQs
</NavLink>

或者直接传入style样式

<NavLink
  to="/faq"
  activeStyle={{fontWeight: "bold",color: "red" }}
>
  FAQs
</NavLink>

5. Redirect

路由重定向组件

<Redirect exact from="/" to="/dashboard" />

from为匹配的路径,如果匹配成功,不会加载组件,而是重定向到to指定的路径。exact表示路径需要完全匹配。

实例

1、创建一个路由配置routerConfig,用来集中管理多个路由组件及属性。

const routerConfig = [
  {
    path: '/',
    exact:true,
    component: Startup
  },
  {
    path: '/main',
    component: App
  },
  {
    path: '/welcome',
    component: Welcome
  }
];

2、自定义一个AppRouter组件,解析routerConfig,创建Route等组件

import React, { Component } from 'react';
import { Switch, Route, MemoryRouter } from 'react-router-dom';
import routerConfig from '../../routerConfig';

class AppRouter extends Component {
  /**
   * 渲染路由组件
   */
  renderNormalRoute = (item, index) => {
    return item.component ? (
      <Route
        key={index}
        path={item.path}
        component={item.component}
        exact={item.exact}
      />
    ) : null;
  };

  render() {
    return (
      <MemoryRouter>
      <Switch>
        {/* 渲染路由表 */}
        {routerConfig.map(this.renderNormalRoute)}

        {/* 首页默认重定向到 /dashboard */}
        {/*<Redirect exact from="/" to="/dashboard" />*/}

      </Switch>
      </MemoryRouter>
    );
  }
}

export default AppRouter;

因为目前是移动端app路由,所以使用的是MemoryRouter,基本也用不上Redirect。这里也可以再封装一层,写一些固定布局,不随路由变化的布局。

3、最后再render AppRouter组件

ReactDOM.render(
    <AppRouter />,
  ICE_CONTAINER
);

4、在页面中使用

import {withRouter} from 'react-router-dom';

@withRouter
class Startup extends Component {
    // .....
}

使用withRouter注入相关类中,直接调用类属性中的history.push方法就可直接跳转路由

this.props.history.push("/main");

允许带入参数

this.props.history.push("/main", {type:1});

或者直接写入路径中

this.props.history.push("/main?type=1");

至此,就简单的集成了react-router-dom

关于react-router,其实还有很多很多没有写,但是呢,日记就先写到这里,想太多一天也写不完,就只是简单记录下个人理解及代码过程。end...

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

推荐阅读更多精彩内容