一步一步搭建react后台系统5之退出登录

一步一步构件react后台系统5 之 退出登录

退出登录

  1. 后台添加退出接口
  • routes/index.js
    直接提示退出成功
router.post('/logout', async (ctx, next) => {
    let body = ctx.request.body
    let username = body.username;
    ctx.body = {
        code: 200,
        message: "退出成功"
    }
})
  1. 修改react后台系统页面
  • components/header.js
import React, { Component } from 'react';
import { Layout, Menu, Icon, Badge } from 'antd';
import { connect  } from 'react-redux'
import { mapLogout } from '@/reducer/connect'  // +-
import { filterData } from '@/utils/index.js'
import { Redirect } from "react-router-dom";
const { Header } = Layout;
const SubMenu = Menu.SubMenu;
const MenuItemGroup = Menu.ItemGroup;
class MyHeader extends Component {
    constructor(props){
        super(props)
        this.state = {
            onSlidecollapsed: this.props.onSlidecollapsed,
            current: 'mail',
            isAuthenticated: true  // +
        };
    }
    toggle = () => {
        this.state.onSlidecollapsed()
    }
    handleClick = (e) => {
        console.log('click ', e);
        this.setState({
            current: e.key,
        });
    }
    logout = (e) => { // +
        this.props.onLogout({})  // 退出登录, 如果是正常项目中, 应该会传递一些数据过去,这里没有用户数据, 因此传递个空对象
        sessionStorage.removeItem('isAuthenticated')  // 发出退出请求后, 直接退出, 无需等待后台返回响应。
        this.setState({
            isAuthenticated: false // 判断是否登录
        })
    }
    render() {
        let { slidecollapsed, toggleSlide, isSlide } = this.props
        slidecollapsed = filterData(slidecollapsed, 'slidecollapsed')
        let avater = '@/logo.svg'
        console.log(this.props)
        if (!this.state.isAuthenticated ) {  // 退出后就重定向
            return <Redirect to="/login" />;
        }
        return (
            <div>
                <Header style={{ background: '#fff', padding: 0 }}>
                    <Icon
                        className="trigger"
                        type={ slidecollapsed ? 'menu-unfold' : 'menu-fold'}
                        onClick={this.toggle}
                    />
                    // + 添加菜单组件

                    <Menu
                        onClick={this.handleClick}
                        selectedKeys={[this.state.current]}
                        mode="horizontal"
                    >
                        <Menu.Item key="1">
                            <Badge count={25} overflowCount={10} style={{marginLeft: 10}}>
                                <Icon type="notification" />
                            </Badge>
                        </Menu.Item>
                        <SubMenu title={<span className="avatar"><img src={avater} alt="头像" /><i className="on bottom b-white" /></span>}>
                            <MenuItemGroup title="用户中心">
                                <Menu.Item key="setting:1">你好 -</Menu.Item>
                                <Menu.Item key="setting:2">个人信息</Menu.Item>
                                <Menu.Item key="logout"><span onClick={this.logout}>退出登录</span></Menu.Item>
                            </MenuItemGroup>
                            <MenuItemGroup title="设置中心">
                                <Menu.Item key="setting:3">个人设置</Menu.Item>
                                <Menu.Item key="setting:4">系统设置</Menu.Item>
                            </MenuItemGroup>
                        </SubMenu>
                    </Menu>
                </Header>

            </div>
        )
    }
}
export default connect(mapLogout.mapStateToProps, mapLogout.mapDispatchToProps)(MyHeader);  // +-
  • reducer/connect.js

删除掉原本的两个方法, 改成对象形式。

export const mapLogout = {
    mapStateToProps: (state) => {
        var slidecollapsed = {
            slidecollapsed: state.slidecollapsed,
            isSlide: false
        }
        return {...state.slidecollapsed, ...slidecollapsed}
    },
    mapDispatchToProps: (dispatch) => {
        return {onSlidecollapsed: () => dispatch(action_slidecollapsed), getRouterConfig: () => {
                return dispatch(routerConfig)
            }, toggleSlide: () => {
                dispatch({type: action_slidecollapsed.type})
            },
            onLogout: (data) => { // + 添加退出事件。
                return dispatch(fetchPosts('/logout', action_slidecollapsed.type, 'logoutData', data))
            }
        }
    }
}
  • 修改了上边的mapLogout, 需要把header与slider组件也修改一下。

  • conponents/header

export default connect(mapLogout.mapStateToProps, mapLogout.mapDispatchToProps)(MyHeader);  // +-
  • componets/slider.js
import { mapLogout } from '@/reducer/connect'
export default connect(mapLogout.mapStateToProps, mapLogout.mapDispatchToProps)(MySlider);

改好了, 现在点击退出登录, 就退出成功了。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容