react 利用路由钩子函数进行设置网页标题以及登录验证
2018-08-30 17:57
357 查看
1.react-router v3
react-router v3中提供的onEnter,onUpdate,onLeave等方法,贯穿于react生命周期。
可以利用这些钩子函数对路由跳转进行处理。
例如:
利用钩子函数,设置网页标题
[code]// 设置标题 const setTitle = (title) => { document.title = title; }
[code]<Route path="user" onEnter={setTitle('后台管理系统')}/>
利用钩子函数进行登录验证(由于现在使用的是4.0,所以,该方法没有验证,先记录一下)
[code]// 登录验证 const requireAuth = (nextState, replace) => { let user = JSON.parse(sessionStorage.getItem('user')); if(!user) { // 未登录 replace({ pathname: '/login', state: { nextPathname: nextState.location.pathname } }); } }
[code]<Route path="user" onEnter={requireAuth}/>
2.react-router v4
react-router v4,舍弃了onEnter,onUpdate,onLeave,它使用componentDidMount或componentWillMount来代替onEnter,使用componentDidUpdate 或 componentWillUpdate来代替onUpdate,使用componentWillUnmount来代替onLeave。
例如:
利用钩子函数,设置网页标题,和登录验证
这里,我们建一个bundle.js文件去处理一些事件
[code]import React, {Component} from 'react' class Bundle extends Component { state = { // short for "module" but that's a keyword in js, so "mod" mod: null, }; componentWillMount() { this.load(this.props) this.setTitle(this.props.title); } componentWillReceiveProps(nextProps) { if (nextProps.load !== this.props.load) { this.load(nextProps) this.setTitle(nextProps.title); } } //设置标题 setTitle(title){ document.title = title || '后台管理系统'; } load(props) { this.setState({ mod: null }); props.load((mod) => { this.setState({ // handle both es imports and cjs mod: mod.default ? mod.default : mod }) }) } render() { return this.props.children(this.state.mod) } } export default Bundle;
[code]import {Route, Switch,Redirect} from 'react-router-dom'; import Bundle from './bundle'; import User from 'bundle-loader?lazy&name=user!manager/system/user'; import EditUser from 'bundle-loader?lazy&name=user!manager/system/editUser'; import NotFound from 'bundle-loader?lazy&name=404!manager/404'; import Login from 'bundle-loader?lazy&name=login!manager/login'; const Loading = function () { return <div>Loading...</div> }; const createComponent = (component,title) => (props) => { let isPass = false;//登录验证 if(props.location.pathname == '/login'){//若为登录 isPass = true; }else{ let user = JSON.parse(sessionStorage.getItem('user')); isPass = user?true:false; } if(isPass){ return ( <Bundle load={component} title={title}> { (Component) => {console.log(Component); return Component ? <Component {...props} /> : <Loading/>} } </Bundle> ); }else{ return ( <Redirect to={{ pathname: '/login', state: { from: props.location } }}/> ); } } const getRouter = () => ( <div> <Switch> <Route exact path="/" component={createComponent(User)}/> <Route exact path="/login" component={createComponent(Login,'后台管理系统登录')}/> <Route exact path="/system/user" component={createComponent(User)}/> <Route exact path="/system/editUser/:opt/:id?" component={createComponent(EditUser)}/> <Route path="*" component={createComponent(NotFound)}/> </Switch> </div> ); export default getRouter;
link链接写在了其他地方,这里不做过多讲解。
上面引用的bundle-loader是react-router4中按需加载的写法,此处不做过多讲解。
阅读更多相关文章推荐
- 有关利用python获取网页, 以及KDD近几年论文标题与摘要链接
- web网页优化 tomcat gzip设置以及验证
- Qt5.9Creator登录界面函数总结(通过连接远程服务器数据库MySql5.7.17进行登录用户名和密码验证)
- 利用长轮询实现模仿网页扫码登录逻辑生成验证随机数
- Vue利用路由钩子token过期后跳转到登录页的实例
- Socket send函数和recv函数详解以及利用select()函数来进行指定时间的阻塞【转】
- 利用函数进行汉字首字母辨别,对字段设置需要的值
- Flex中如何利用dataDescriptor和labelFunction属性,以及hasChildren()和getChildren()函数设置Tree中包含子节点个数
- 接口测试入门(3)--使用httpClient进行登录用例操作/set-cookies验证/ List<NameValuePair>设置post参数/json解析
- 抓取网页中的内容、如何解决乱码问题、如何解决登录问题以及对所采集的数据进行处理显示的过程
- Java利用HttpClient进行网页登录
- [Java]利用拦截器和自定义注解做登录以及权限验证
- 在进行验证的时候,用户名登录注册,然后没有输入用户名,提示“请输入用户名!”,并且出现focus()函数,表示焦点在用户名输入框。
- Vue利用路由钩子token过期后跳转到登录页
- 网页基础第1课之“ 利用 session 实现循环3次登录验证”
- 利用拦截器和自定义注解做登录以及权限验证
- ssh如何利用RSA公钥进行远程登录验证
- Flex中如何利用dataDescriptor和labelFunction属性以及hasChildren()和getChildren()函数设置Tree中包含子节点个数的例子
- 利用Spring进行LDAP验证登录遇到的问题及其解决方式
- 直接使用默认设置进行打印:(1)使用IE浏览器时利用ScriptX打印网页