一、前言
react-router在网上找了很多资料和demo,才发现旧的一些demo根本运行不了,后来找到原因说是因为版本更新,新的版本与旧的版本差别很大,所以我这边做了这一期最新版本的组件的一些介绍。
另外这里只介绍 react-router-dom ,react-router-native暂不提及,当前react-router-dom的版本为5.0.1,react-router的版本也是5.0.1。
一、基本理解
二、react-router-dom 对应组件介绍
react-router-dom源码 esm文件夹里的react-router-dom.js 里导出组件
export * from 'react-router’;//这里导出react-router里的所有内容
export { BrowserRouter, HashRouter, Link, NavLink };
在 react-router 源码中 esm文件夹里的react-router.js里导出组件。
export { MemoryRouter, Prompt, Redirect, Route, Router,
StaticRouter, Switch, generatePath, matchPath,
withRouter, context as __RouterContext };
下面根据导出的这些组件进行介绍。
三、BrowserRouter、HashRouter,MemoryRouter,NativeRouter,StaticRouter,Router
用来包含路由的父组件,Link和Route等都必须在它们内才能使用
使用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();
...
四、
点击时,url会更新,组件会被重新渲染,但是页面不会重新加载用来跳转路由的。
Link 组件最终会渲染为 HTML 标签 ,它的 to、query、hash 属性会被组合在一起并渲染为 href 属性。虽然 Link 被渲染为超链接,但在内部实现上使用脚本拦截了浏览器的默认行为,然后调用了history.pushState 方法(注意,文中出现的 history 指的是通过 history 包里面的 create*History 方法创建的对象,window.history 则指定浏览器原生的 history 对象,由于有些 API 相同,不要弄混)。
属性:to 和 replace 两个属性
// to为string
关于
// to为location对象
location = {
pathname, // 当前路径,即 Link 中的 to 属性
search, // search
hash, // hash
state, // state 对象
action, // location 类型,在点击 Link 时为 PUSH,浏览器前进后退时为 POP,调用 replaceState 方法时为 REPLACE
key, // 用于操作 sessionStorage 存取 state 对象
};
// replace,默认为false,设为true表示替换
五、
// activeClassName选中时样式为selected
FAQs
// 选中时样式为activeStyle的样式设置
FAQs
六、
Route 是 React Router中用于配置路由信息的组件,每当有一个组件需要根据 URL 决定是否渲染时,就需要创建一个 Route。
react-router 中的很多特性都与 React 保持了一致,比如它的声明式组件、组件嵌套,当然也包括 React 的状态机特性。
path——每个Route都需要一个path属性,path属性是一个url,当URL匹配一个Route时,这个Route中定义的组件就会被渲染出来。
Component渲染方式——component的值是一个组件,当URL和Route匹配时,Component属性定义的组件就会被渲染。
Render的渲染方式——Render 值是一个函数,这个函数返回一个React元素。这种方式方便地为待渲染的组件传递额外的属性。
{
return 6666
}}>
//里面还可以进行路由的嵌套
{
return (
)
}}>
七、withRouter——包装任何自定义组件,将react-router 的 history,location,match 三个对象传入
无需一级级传递react-router 的属性,当需要用的router
属性的时候,将组件包一层withRouter,就可以拿到需要的路由信息
const Mbox=withRouter(Box);
//这时候就能用 获取history,location,match 三个对象
八、
无
属性:location
Switch可以传递一个location对象,路由匹配将和这个location对象进行比较,而不是url
Route元素会比较path,Redirect会比较from,如果他们没有对应的属性,那么就直接匹配
九、matchPath也是和后端相关的,主要作用就是生成一个match对象
import { matchPath } from 'react-router'
const match = matchPath('/a/123',{
path: '/a/:id',
exact: true,
strict: false
})
第一个参数是pathname
第二个参数是一个对象,里面的属性和route的属性类似,用来和pathname做对比
如果匹配的话,就产生一个match对象,反之,null
十、Prompt
Prompt是用来提示用户是否要跳转,给用户提示信息默认使用window.confirm,可以结合getUserConfirmation构建自定义提示信息
import { Prompt } from 'react-router'
属性:message,when
{//函数根据返回值进行跳转处理
console.log(location);//接受参数对象:例{pathname: "/main/about", search: "", hash: "", state: undefined}
//写法一
if(confirm("是否要离开页面?")){
return true;//表示进行跳转
}else{
return false;//表示不进行跳转
}
//写法二,效果等同于写法一
return "是否要离开页面?"
}}/>
十一、Redirect——重定向
当用户访问某界面时,该界面并不存在,此时用Redirect重定向,重新跳到一个我们自定义的组件里。
一般放在
to:字符串,要重定向的路径/对象,location对象
push,布尔值,是否将当前路径存到history中(是Link标签的to路径)
from,用来指定路由的原始值,如果不是给定的字符串,那么不渲染,反之渲染,只能用于switch组件中
- 首页
- 关于
- 重定向
//push为true,重定向一次,history.length+=2,为false,history.length+=1