学习react-router之基本路由
注意:这里的React-Router适用于
"react-router-dom": "^5.2.0"
代码仓库skyone-wzw/learn-react-router
同时注意一下,
react-router-dom
依靠react-router
,也就是说安装了前者就不需要安装后者了
运行环境:
OS:
windows10
node:
v14.17.3
IDE:
webstorn
包管理器:
yarn
这次我们的目标是创建一个拥有简单路由的页面
包含三个链接和一个框框,要求在不产生新的HTTP请求的情况下加载三个普通页面和一个404页面,三个链接不变,框框中显示页面的内容。

创建React工程
初始化工程
为了省事,直接使用create-react-app
创建工程吧,
不需要安装任何前置组件,直接在你想要创建工程的文件夹运行
1 | npx create-react-app ${你工程的名字} |
目录结构就不多做介绍了,相比都知道,即使不知道多半也能猜出来
安装依赖
这里我安装两个库
@types/react
这个库用于辅助代码提示
react-router-dom
本文的主题啦,react的路由库
尝试运行
以下三个命令几乎是最常用的了,这里指出,后面不再说明
运行dev版
这样运行会监听文件修改并热更新,还会提供错误提示,如果浏览器安装了react插件,还能在检查元素中快速调试。
1 | yarn start |
编译
把代码编译成可以直接在浏览器上运行的代码
1 | yarn build |
运行简单的静态服务器
编译代码后可以看看是否运行正常
1 | server build |
这里我们运行yarn start
浏览器弹出http://localhost:3000
编写代码
先把src
目录的文件删了吧
index.js
入口函数
然后我们创建应用的入口src/index.js
1 | import ReactDOM from 'react-dom'; |
很简单嘛,就是把App
加载到#root
元素里嘛
App
组件
创建App
组件src/App.jsx
1 | import React, {Component} from 'react'; |
从这里重点就要开始咯
App.jsx
中的内容将是我们显示在主页的内容,包含三个链接和一个框框,当然这个类可以用函数代替
1 | function App(props) { |
但是rcc
这个快捷指令多省事,干嘛不用呐?
Link
就相当于是HTML中的a
标签,完成页面的不刷新加载
我们再给box
写一个样式吧,实验嘛,一切从俭好吧,懒字当头万事难
创建src/default.css
1 | .box { |
这个notfound
用于404的图片,这里先写出来
List
和Detail
组件
List
组件用于渲染/list
页面
上代码,src/List.jsx
1 | import React, {Component} from 'react'; |
这个跳转按钮我们先不实现它的功能,先把要显示的东西写出来
Detail
组件用于渲染/detail
页面
src/Detail.jsx
1 | import React, {Component} from 'react'; |
404页面
很简单,和上面的没有什么区别
只是导入了一个404.svg
的图片而已,必须这样导入,只有这样webpack
才能找到资源并打包
1 | import React, {Component} from 'react'; |
基本路由
路由文件一般只写路由逻辑,而不包含其他东西
src/router/BaseRouter.jsx
1 | import React, {Component} from 'react'; |
路由方式
react-router
有三种路由方法:
HashHistory
BrowserRouter
MemoryHistory
官方建议使用BrowserRouter
,原因是:好看。。。
至于三者有什么区别:
BrowserRouter
就是浏览器原生的路由,例如http://localhost:3000/list
就是/list
HashHistory
则使用URL的hash值作为路由,例如http://localhost:3000/#/list
表示/list
,注意不要搞混了,URL
的PATH
到/
就结束了,#
后面的表示哈希(当然查询字符串?
除外)
MemoryHistory
暂时没学,不懂
使用路由
对于React-Router4,要使用路由,必须先选择路由方式
很简单,使用指定组件包住需要路由的最顶层目录(一般直接是根目录)就可以了,例如下面这个结构
1 | <BrowserRouter> |
- 最外层的
BrowserRouter
定义里面的元素全部使用Browser
路由,当然其他两种路由也是一样的道理。同时要注意,该组件的子元素无论如何嵌套,都不需要在使用该组件了。 Route
就像是判断URL是否符合条件,只有符合path
条件的才会渲染component
里的元素Switch
组件包括的Route
或其他组件只会渲染符合条件的第一个,后面的即使符合条件也不会渲染,值得注意的是,Switch
里面不一定只能包含Route
,也可以包含其他组件,但是其他组件没有符合条件一说,所以只要前面没有符合条件的Route
就一定会渲染,当然后面的就不会渲染了,Switch
只渲染一个子元素Route
的exact
属性表示精确匹配,因为在同级组件下,不添加exact
属性会导致path="/"
会匹配到所有/
开头的路由。例如:在不加exact
属性的条件下path="/"
会匹配到/abc
,path="/asd"
会匹配到/asd123
;而精确匹配下exact path="/"
只能匹配到/
,exact path="/asd"
只能匹配到/asd
回头看我们写的代码,很简单,就是匹配到/
开头的URL就运行AppRouter
,额,似乎有点多此一举。。。不过算了。
AppRouter
组件
AppRouter
是一个子路由,里面控制我们的三个URL/
、/list
、/detail
和特殊的/404
1 | import React, {Component} from 'react'; |
我们在App
组件里放了个组件,读读这段代码,看看你理解Switch
没有
1 | <App> |
这段代码表示:
如果/
就渲染一个h2
标签
如果/list
就渲染List
组件
如果/detial
就渲染Detial
组件
如果/404
就渲染NotFound
组件
如果都不匹配,才渲染Redirect
组件,跳转到/404
Switch
只渲染一个组件!
修改App
组件
由于 App
组件有子元素,我们要指定子元素显示的位置,稍稍修改src/App.jsx
1 | import React, {Component} from 'react'; |
this.props.children
即代表子元素
好啦,Ctrl + S
保存,代码会自动被渲染,打开浏览器看看吧
虽然按钮功能还没有实现,但链接已经可以点了
实现按钮跳转
这里我只演示如何修改List
,Detail
自己改
src/List.jsx
1 | import React, {Component} from 'react'; |
this.props.history.push("/detail");
这一句表示跳转到/detail
,和点击Link
组件跳转是一模一样的。同样的方法还有
1 | this.props.history.push(path: Path, state?: HistoryLocationState): void; |
看名字都能猜出来怎么用吧~~~~
基本和DOM的history
差不多的
编译&&部署
编译很简单,一行命令
1 | yarn build |
至于部署嘛,要注意一下:
由于路由由React实现,页面本质上只有index.html
,所以nginx
配置文件需要少许修改,例如
/etc/nginx/conf.d/test.conf
1 | server { |

想要向我的一样在本地实现SSL小绿锁也不是很难,下一篇文章我会写怎么配置的。
【完】