使用 react-router v4.0 实现重定向和 404 功能
在使用 react 开发中,重定向和 404 这种需求非常常见,使用 React-router v4.0 可以使用 Redirect 进行重定向,最常用的就是用户登录之后自动跳转主页。
import React, { Component } from 'react'; import axios from 'axios'; import { Redirect } from 'react-router-dom'; class Login extends Component{ constructor(){ super(); this.state = {value: '', logined: false}; this.handleChange = this.handleChange.bind(this); this.toLogin = this.toLogin.bind(this); } handleChange(event) { this.setState({value: event.target.value}) } toLogin(accesstoken) { axios.post('yoururl',{accesstoken}) .then((res) => { this.setState({logined: true}); }) } render() { if(this.props.logined) { return ( <Redirect to="/user"/> ) } return ( <div> <input type="text" value={this.state.value} onChange={this.handleChange} /> <a onClick={() => { this.toLogin(this.state.value) }}>登录</a> </div> ) } } export default Login;
以上这个示例仅仅是将登录的状态作为组件的 state 使用和维护的,在实际开发中,是否登录的状态应该是全局使用的,因此这时候可能你会需要考虑使用 redux 等这些数据状态管理库,方便我们做数据的管理。
这里需要注意的使用传统的登录方式使用 cookie 存储无序且复杂的 sessionID 之类的来储存用户的信息,使用 token 的话,返回的可能是用户信息,此时可以考虑使用 sessionStorage、localStorage 来储存用户信息(包括头像、用户名等),此时书写 reducer 时需要指定初始状态从存储中获取,如:
const LOGIN_SUCCESS = 'LOGIN_SUCCESS'; const LOGIN_FAILED = 'LOGIN_FAILED'; const LOGINOUT = 'LOGINOUT'; const Login = function(state, action) { if(!state) { console.log('state'); if(sessionStorage.getItem('usermsg')) { return { logined: true, usermsg: JSON.parse(sessionStorage.getItem('usermsg')) } } return { logined: false, usermsg: {} } } switch(action.type) { case LOGIN_SUCCESS: return {logined: true,usermsg: action.usermsg}; case LOGIN_FAILED: return {logined: false,usermsg:{}}; case LOGINOUT: return {logined: false, usermsg: {}}; default: return state } }; export default Login;
指定 404 页面也非常简单,只需要在路由系统最后使用 Route 指定 404 页面的 component 即可
<Switch> <Route path="/" exact component={Home}/> <Route path="/user" component={User}/> <Route component={NoMatch}/> </Switch>
当路由指定的所有路径没有匹配时,就会加载这个 NoMatch 组件,也就是 404 页面
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: Webpack 系列之快速入门
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论