|
| 1 | +# 路由 |
| 2 | + |
| 3 | +关于路由,我们得先了解,什么是单页面应用程序和多页面应用程序,因为路由是帮助我们实现单页面应用程序的关键 |
| 4 | +|type|des| |
| 5 | +|-|-| |
| 6 | +|实现单页面应用程序single page application(SPA)|不刷新整个页面,永远在一个`index.html`,依靠路由切换具体的场景,首次加载大部分大部分东西,后面异步加载具体要更新的内容| |
| 7 | +|多页面应用程序|页面跳转,整体刷新,资源文件重新加载| |
| 8 | + |
| 9 | + |
| 10 | +在[React-Router-DOM官方文档](https://reacttraining.com/react-router/web/guides/quick-start)中你会看到关于 React 路由有以下可以选装的模块 |
| 11 | + |
| 12 | +|引用|作用| |
| 13 | +|-|-| |
| 14 | +|react-router|React Router 核心| |
| 15 | +|react-router-dom|用于DOM绑定的React Router| |
| 16 | +|react-router-native|用于React Native的React Router| |
| 17 | +|react-router-redux|React Router和Redux的集成| |
| 18 | +|react-router-config|静态路由配置的小助手| |
| 19 | + |
| 20 | +## react-router和react-router-dom的区别 |
| 21 | +在React的使用中,我们一般要引入两个包,react 和 react-dom,react-router 和react-router-dom 并不是两个都要引用的 |
| 22 | +他们两个只要引用一个就行了,不同之处就是后者比前者多出了`<Link>`和`<BrowserRouter>`这样的 DOM 类组件。 |
| 23 | +因此我们只需引用react-router-dom这个包就行了。当然,如果搭配 redux,你还需要使用 react-router-redux 或者 react-redux |
| 24 | + |
| 25 | +那现在我们选用的是 react-router-dom,所以先安装路由模块 react-router-dom |
| 26 | + |
| 27 | +```bash |
| 28 | +npm install react-router-dom |
| 29 | +``` |
| 30 | + |
| 31 | +## BrowserRouter和HashRouter |
| 32 | + |
| 33 | +**react-router4**的[官方文档](https://reacttraining.com/react-router/web/guides/quick-start)默认使用的是`BrowserRouter,BroswerRouter`是需要服务端配合的,服务端重定向到首页,`BrowserRouter`是基于html5的`pushState`和`replaceState`的,很多浏览器不支持,存在兼容性问题。所以新手推荐使用`HashRouter` |
| 34 | + |
| 35 | +简单总结`BrowserRouter`称为浏览器路由,使用的时候是url上面不带`#`,兼容性比较差,需要后端配合,比较好看,`HashRouter`称之为哈希路由,兼容性比较高 |
| 36 | + |
| 37 | + |
| 38 | +react-router-dom 有三个内置组件 |
| 39 | +```js |
| 40 | +import { HashRouter as Router , Link , Route} from "react-router-dom"; |
| 41 | +``` |
| 42 | +`Router`的作用是让包裹的子组件产生路由场景,相当于 Vue 中的`<router-view>` |
| 43 | +```js |
| 44 | +ReactDOM.render( |
| 45 | + <Router> |
| 46 | + <App /> |
| 47 | + </Router> |
| 48 | +, document.getElementById('root')); |
| 49 | +``` |
| 50 | +`Link`相当于`<a>`标签,提供跳转路由的功能 |
| 51 | +```html |
| 52 | +<link to = "/xxxx"> |
| 53 | +``` |
| 54 | +Route相当于`vue-router`里面的配置参数 |
| 55 | +```html |
| 56 | +<Route path="/" exact component={Index} /> |
| 57 | +<Route path="/detail/" component={Detail} /> |
| 58 | +``` |
| 59 | +上面代码的含义为 |
| 60 | + |
| 61 | +url匹配到`#/`切换到`Index`组件 |
| 62 | + |
| 63 | +url匹配到`#/detail/`切换到`Detail`组件 |
| 64 | + |
| 65 | +## 嵌套路由 |
| 66 | + |
| 67 | + |
| 68 | +路由里面放路由,第一层路由`/home/`, |
| 69 | +```html |
| 70 | +<Route path="/home/" exact component={Index} /> |
| 71 | +``` |
| 72 | +嵌套路由就是在Index组件里面在放一个`<Route>`组件,当进入`/home/hot`路径时,既加载`Index`组件,也加载`Wpannel`组件 |
| 73 | +```html |
| 74 | +<Route path="/home/hot/" exact component={Wpannel} /> |
| 75 | +``` |
| 76 | +注意,嵌套路由的`path`是要把第一层路由的路径加上 |
| 77 | + |
| 78 | +## 编程式导航 |
| 79 | + |
| 80 | +除了使用`<Link>`标签跳转路由,还可以使用路由提供给你的`this.props.history`进行跳转 |
| 81 | + |
| 82 | +## 路由传参 |
| 83 | + |
| 84 | +|状态|方式| |
| 85 | +|-|-| |
| 86 | +|Route component|以this.props.match方式| |
| 87 | +|Route render|以({ match })=>()方式| |
| 88 | +|Route children|以({ match })=>()方式| |
| 89 | +|withRouter|以this.props.match方式| |
0 commit comments