老师,帮忙看下为什么登录后也跳转不了vip页

老师,帮忙看下为什么登录后也跳转不了vip页

login部分:

import React, { Component, Fragment} from "react";
import "antd/dist/antd.css";
import { Modal, Button, message} from 'antd';
// 导入样式
import "./sign.css";
import axios from "axios";
import { Link } from "react-router-dom";
class Sign extends Component {
    constructor(props) {
        super(props)
        this.showModal = this.showModal.bind(this)
        this.handleOk = this.handleOk.bind(this)
        this.handleCancel = this.handleCancel.bind(this);
        this.setName = this.setName.bind(this);
        this.setPassWord = this.setPassWord.bind(this);
        this.outLogin = this.outLogin.bind(this)
        this.nameDom = "";
        this.passwordDome = "";
        this.state = {
            name: '',
            password: '',
            isModalVisible: false,
            login:false
        }
    }
    shouldComponentUpdate() {
        if (this.state.nameDom && this.state.passwordDome) {
            return false
        } else {
            return true
        }
    }
    render() {

        return (
            <div className='sign'>
                <Fragment>
                {
                        this.state.login ? 
                        <Button className='sign-btn' type="primary" onClick={this.showModal}>登录</Button> :
                        <Button className='sign-btn' type="primary" onClick={this.outLogin}>退出</Button>
                      
                    }
                    <Link to='/vip'><Button className='sign-btn' type="primary">VIP</Button></Link>
                    
                    <Modal title="登录" visible={this.state.isModalVisible} onOk={this.handleOk} onCancel={this.handleCancel}>
                        <div className='input-name' style={{marginBottom:'10px'}}><input onChange={this.setName} value={this.state.name} placeholder='请输入用户名'></input></div>
                        <div className='input-password'><input onChange={this.setPassWord} value={this.state.password} placeholder='请输入密码'></input></div>
                    </Modal>
                </Fragment>
            </div>

        )
    }
    showModal() {
        const isModalVisible = true;
        this.setState({ isModalVisible })
    };

    handleOk() {
        // 将用户名和密码添加到url并发送
       const url = `http://www.dell-lee.com/react/api/login.json?user=${this.state.name}&password=${this.state.password}`;
       axios(url,{withCredentials:true}).then(response=>{
        //    获取登录结果
          const {login} = response.data.data;
         if(login){
            //  登录成功
            message.info('登录成功');
            // 关闭登录框,并更新状态
            this.setState({
                isModalVisible: false,
                login:false
            })
         }else{
            //  登录失败
            message.info('登录失败');
         }
       })
    };
    handleCancel() {
        const isModalVisible = false;
        this.setState({ isModalVisible })
    };

    componentDidMount(){
        axios('http://www.dell-lee.com/react/api/isLogin.json',{withCredentials:true}).then(response=>{
            const {login} = response.data.data
            this.setState({login})
        })
    }

    // 设置用户名
    setName(e){
        const {value} =e.target
        this.setState({
            name:value
        })
    }
    // 设置密码
    setPassWord(e){
        const {value} =e.target
        this.setState({
            password:value
        })
    }

    // 退出登录
    outLogin(){
        axios('http://www.dell-lee.com/react/api/logout.json',{withCredentials:true}).then(response=>{
            const {logout}=response.data.data;
            // 设置登录状态
            this.setState({
                login: logout
            })
        })
    }   
}
export default Sign
           

vip部分:

import React, { Component} from "react";
import { Redirect } from "react-router";
import axios from "axios";
import "./vip.css"
class Vip extends Component {
constructor(props){
super(props)
this.state={
login:false
}
}
render(){
// 登录状态下
console.log(this.state.login)

if(this.state.login){
return <div className='vip'>vip</div>
}else{
// 非登录状态下跳回首页
return <Redirect to='/' />
}
}
componentDidMount(){
axios('http://www.dell-lee.com/react/api/isLogin.json',{withCredentials:true}).then(response=>{
const {login} = response.data.data
this.setState({login:login})
})
}
}
export default Vip

    

相关截图:

https://img1.sycdn.imooc.com//climg/6159ac11097c5c2807520545.jpg

问题描述:

测试了一下好像是这里的setState没有起作用,这是为什么呢

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕久久 2021-10-06 12:53:53

同学你好,新版本的谷歌浏览器不支持跨域携带cookie,因此可能导致即使登录了,也无法跳转到vip页面。建议同学换成火狐、360浏览器测试一下。

另外,同学的逻辑有问题:

登录页,登录成功后,应该显示“退出按钮”:

https://img1.sycdn.imooc.com//climg/615d28ee097fc06811620393.jpg

因此,各个方法中,设置login变量时,要注意login的值是true还是false,例如:

https://img1.sycdn.imooc.com//climg/615d295909513a4907010432.jpg

其他方法中login的值,也需要调整。

vip页面:

login的初始值是false,componentDidMount执行后,不会执行render方法,因此即使登录成功,也不会将login改成true,需要借助其他变量实现效果:

https://img1.sycdn.imooc.com//climg/615d2bcc099cca0c08000340.jpg

建议同学参考源码,把上述代码中的问题都调整一下。

如果有疑问,建议新建问题,再把代码粘贴上来,老师帮你调整。

祝学习愉快!

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师