반응에 isloggedin 기능이 작동하지 않습니다.

줄리안 베르 몰렌

저는 React에서 배우고 연습하기 시작했습니다. 제 생각은 로그인 화면을 만드는 것이 었는데, 여기서 나머지 API를 호출하고 사용자를 메모리에 저장하고, 로그인 할 때 사용자를 홈으로 리디렉션했습니다. 문제는 사용자가 로그인하면 로그인 화면을 볼 수 없다는 것입니다. 이렇게하려면 "isLogged"상태를 "login"구성 요소에 보내고 사용자가 "Logged"상태이면 리디렉션하려고합니다. 문제는 상태가 올바르게되지 않는다는 것입니다.

app.js

import React, { Component } from 'react';
import { BrowserRouter as Router, Route } from 'react-router-dom'
import './App.css';
import Login from './Pages/Login/Login'
import Logout from './Pages/Logout/Logout'
import Home from './Pages/Home/Home'


export default class App extends Component{
  constructor(){
    super();

    this.state = {
      loggedIn: "no-logueado",
      user:{},
    };

    this.handleLogin = this.handleLogin.bind(this);
    this.handleLogout = this.handleLogout.bind(this);
    this.loggedIn = this.loggedIn.bind(this);  

  }

  handleLogin(data){
    this.setState({
      loggedIn: "Logueado",
      user: data
    });
  }

  handleLogout(){
    this.setState({
      loggedIn: "no-logueado",
      user: {}
    });
  }

  isLoggedin(){
    const token = localStorage.getItem("authToken");
    if(this.state.loggedIn === "no-logueado" && token){
      this.setState({
        loggedIn: "Logueado",
        user: token
      });
    }
  }

  loggedIn(data){
    if(data === "Logueado"){
      window.location="/home";
    }
  }

async componentDidMount(){
  await this.isLoggedin();
}

  render() {
    
      return (
        <Router>
          <Route exact path="/" render={props => ( <Login {... props} handleLogin={this.handleLogin} loggedIn={this.state.loggedIn}/>)} />
          <Route exact path="/logout" render={props => ( <Logout {... props} handleLogout={this.handleLogout}/>)} />
          <Route exact path="/home" render={props => (<Home {... props} loggedIn={this.loggedIn} log={this.state.loggedIn}/>)} />


          <script src="https://unpkg.com/react/umd/react.production.min.js" crossorigin></script>

          <script
            src="https://unpkg.com/react-dom/umd/react-dom.production.min.js"
            crossorigin></script>

          <script
            src="https://unpkg.com/react-bootstrap@next/dist/react-bootstrap.min.js"
            crossorigin></script>

          <script>var Alert = ReactBootstrap.Alert;</script>
        </Router>
      );
  }
}

로그인

import React, { Component } from 'react'
import Input from './Components/Input/input'
import Label from './Components/Label/Label'
import 'bootstrap/dist/css/bootstrap.min.css';
import './Login.css'
import {Container, Row, Col, Button} from 'react-bootstrap'

export default class Login extends Component {
    constructor(props) {
        super(props);

        this.state = {
            user:' ',
            password:' '
        }

        this.handleChange = this.handleChange.bind(this);
        this.handleSubmit = this.handleSubmit.bind(this);
        this.handleSuccessfullAuth = this.handleSuccessfullAuth.bind(this);
    }

    handleChange(name, value) {
        if(name==='username'){
            this.setState({user:value});
        } else {
            this.setState({password:value});
        }
    }

    async handleSubmit(){

            const requestOptions = {
                    method: 'POST',
                    headers: {'Content-Type': 'application/json'},
                    body: JSON.stringify({ 
                        email: this.state.user,
                        password:this.state.password
                    })
            };
            
            const response = await fetch('http://localhost:4000/login', requestOptions);
            console.log(response.ok);
            if(response.ok){
                const res = await response.json();
                localStorage.setItem("authToken", res.token)
                this.handleSuccessfullAuth(res);
            } else {
                console.log("token", localStorage.getItem("authToken"))
            }
             
        }

        handleSuccessfullAuth(data){
            this.props.handleLogin(data);
            this.props.history.push("/home");
        }
    
        componentDidMount(){
            console.log(this.props.loggedIn)
        }

    render(){
        return (       
            <div id="login-background">
                <Container>
                    <Row>
                        <Col xs={6}>
                            <Col xs={8}  className="back">
                                <h2 className="tittle-login">¡ Bienvenido !</h2>
                                <h2 className="tittle-login">{this.props.loggedIn}</h2>
                                <hr className="hr-design"></hr>
                            <Label text='Usuario'/>
                            <Input attribute= {{
                                id: 'username',
                                name:'username',
                                type:'text',
                                placeholder:'Ingrese su usuario ...',
                                className:'form-control'
                            }}
                            handleChange={this.handleChange}
                            />
                            <Label text='Contraseña'/>
                            <Input attribute= {{
                                id: 'password',
                                name:'password',
                                type:'password',
                                placeholder:'Ingrese su contraseña ...',
                                className:'form-control'
                            }}
                            handleChange={this.handleChange}
                            /><br></br>
                            <Button variant="primary" size="lg" block onClick={this.handleSubmit}>Iniciar Sesión</Button>{' '}
                            </Col>
                            <Col xs={4}>

                            </Col>
                                
                        </Col>
                        <Col>
                        
                        </Col>
                            
                    </Row>
                </Container>
            </div>
        )
    }
}


콘솔을 통해 상태가 "로그인"에 도달하는 방법을 볼 때 화면에 "로그인"이 표시되지만 "로그인하지 않음"으로 표시됩니다.

먼저 배워야 할 게 있거나 놓친 게있는 것 같아요. 도와 줄 수 있나요?

"Logueado"를 렌더링하지만 콘솔에서 "No-logueado"상태를 얻습니다.

import React, { Component } from 'react'
import Menu from '../../Components/Menu'


export default class Home extends Component {
    constructor(props) {
        super(props);
    }

    render() {
        return (
            <div>
               <Menu/>
            </div>
        )
    }
}

베냐민

사용자가 로그인 한 경우에서 Redirect구성 요소를 사용하여 'react-router-dom'로그인 페이지에서 홈 페이지로 리디렉션 할 수 있습니다 .

render()함수 안에 조건부 반환을 추가하기 만하면 됩니다.

  render() {
    if (this.props.loggedIn === STATE_LOGGED_IN) {
      return <Redirect path="/home" />;
    }

    return (
      <div id="login-background">
        <Container>
    ...

또한 자유롭게 구성 요소를 리팩토링 할 수있었습니다. 몇 가지 제안이 있습니다.

화살표 기능

첫째, 바인딩이 필요한 클래스 메서드 대신 화살표 함수를 사용할 수 있습니다. 화살표 함수에는 this키워드 가 없으므로 바인딩이 필요하지 않습니다.

  handleLogin = (data) => {
    this.setState({
      loggedIn: STATE_LOGGED_IN,
      user: data,
    });
  };

자식 라우팅

둘째, 렌더링 children형식 을 사용하는 것이 좋습니다 <Route>. 훨씬 깨끗하고 읽기 쉽습니다.

      <Router>
        <Route exact path="/">
          <Login handleLogin={this.handleLogin} loggedIn={this.state.loggedIn} />
        </Route>
        <Route exact path="/logout">
          <Logout handleLogout={this.handleLogout} />
        </Route>
        <Route exact path="/home">
          <Home loggedIn={this.state.loggedIn} />
        </Route>
      </Router>

window.location을 조작하지 마십시오.

을 호출 한 함수를 제거했음을 알 수 있습니다 window.location="/home". react-router-dom직접 수정하는 대신 위치 변경 에 사용 하는 것이 좋습니다 window.location.

const 문자열 사용

마지막으로, 문자열 'Logueado''no-logueado'문자열 을 const 문자열로 지정하는 것이 좋습니다. const를 사용하면 문자열을 잘못 입력하는 문제를 방지 할 수 있습니다.

export const STATE_LOGGED_IN = 'Logueado';
export const STATE_LOGGED_OUT = 'no-logueado';

App.js

import React, { Component } from 'react';
import { BrowserRouter as Router, Route } from 'react-router-dom';
import './App.css';
import Login from './Pages/Login/Login';
import Logout from './Pages/Logout/Logout';
import Home from './Pages/Home/Home';

export const STATE_LOGGED_IN = 'Logueado';
export const STATE_LOGGED_OUT = 'no-logueado';

export default class App extends Component {
  constructor() {
    super();

    this.state = {
      loggedIn: STATE_LOGGED_OUT,
      user: {},
    };
  }

  componentDidMount() {
    this.isLoggedin();
  }

  handleLogin = (data) => {
    this.setState({
      loggedIn: STATE_LOGGED_IN,
      user: data,
    });
  };

  handleLogout = () => {
    this.setState({
      loggedIn: STATE_LOGGED_OUT,
      user: {},
    });
  };

  isLoggedin = () => {
    const token = localStorage.getItem('authToken');
    if (this.state.loggedIn === STATE_LOGGED_OUT && token) {
      this.setState({
        loggedIn: STATE_LOGGED_IN,
        user: token,
      });
    }
  };

  render() {
    return (
      <Router>
        <Route exact path="/">
          <Login handleLogin={this.handleLogin} loggedIn={this.state.loggedIn} />
        </Route>
        <Route exact path="/logout">
          <Logout handleLogout={this.handleLogout} />
        </Route>
        <Route exact path="/home">
          <Home loggedIn={this.state.loggedIn} />
        </Route>
      </Router>
    );
  }
}

Login.js

render 메서드에서 조건부 반환을 확인하십시오.

import React, { Component } from 'react';
import Input from './Components/Input/input';
import Label from './Components/Label/Label';
import 'bootstrap/dist/css/bootstrap.min.css';
import './Login.css';
import { Container, Row, Col, Button } from 'react-bootstrap';
import { STATE_LOGGED_IN, STATE_LOGGED_OUT } from '../../App';
import { Redirect } from 'react-router';

export default class Login extends Component {
  constructor(props) {
    super(props);

    this.state = {
      user: ' ',
      password: ' ',
    };
  }

  componentDidMount() {
    console.log(this.props.loggedIn);
  }

  handleChange = (name, value) => {
    if (name === 'username') {
      this.setState({ user: value });
    } else {
      this.setState({ password: value });
    }
  }

  async handleSubmit = () => {
    const requestOptions = {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({
        email: this.state.user,
        password: this.state.password,
      }),
    };

    const response = await fetch('http://localhost:4000/login', requestOptions);
    console.log(response.ok);
    if (response.ok) {
      const res = await response.json();
      localStorage.setItem('authToken', res.token);
      this.handleSuccessfullAuth(res);
    } else {
      console.log('token', localStorage.getItem('authToken'));
    }
  }

  handleSuccessfullAuth = (data) => {
    this.props.handleLogin(data);
    this.props.history.push('/home');
  }

  render() {
    if (this.props.loggedIn === STATE_LOGGED_IN) {
      return <Redirect path="/home" />;
    }

    return (
      <div id="login-background">
        <Container>
          <Row>
            <Col xs={6}>
              <Col xs={8} className="back">
                <h2 className="tittle-login">¡ Bienvenido !</h2>
                <h2 className="tittle-login">{this.props.loggedIn}</h2>
                <hr className="hr-design"></hr>
                <Label text="Usuario" />
                <Input
                  attribute={{
                    id: 'username',
                    name: 'username',
                    type: 'text',
                    placeholder: 'Ingrese su usuario ...',
                    className: 'form-control',
                  }}
                  handleChange={this.handleChange}
                />
                <Label text="Contraseña" />
                <Input
                  attribute={{
                    id: 'password',
                    name: 'password',
                    type: 'password',
                    placeholder: 'Ingrese su contraseña ...',
                    className: 'form-control',
                  }}
                  handleChange={this.handleChange}
                />
                <br></br>
                <Button variant="primary" size="lg" block onClick={this.handleSubmit}>
                  Iniciar Sesión
                </Button>{' '}
              </Col>
              <Col xs={4}></Col>
            </Col>
            <Col></Col>
          </Row>
        </Container>
      </div>
    );
  }
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

JavaScript에서 기능 반복이 작동하지 않습니다.

분류에서Dev

"const isLoggedIn = props.isLoggedIn;"의 목적은 무엇입니까? 반응 빠른 시작 / 조건부 렌더링 문서에서와 같이?

분류에서Dev

단순 onClick 반환 기능이 작동하지 않습니다.

분류에서Dev

반품 확인 기능이 작동하지 않습니다.

분류에서Dev

onclick 기능이 PHP에서 작동하지 않습니다.

분류에서Dev

내 기능이 wordpress에서 작동하지 않습니다.

분류에서Dev

Qt 5.2에서 qWait 기능이 작동하지 않습니다.

분류에서Dev

jQuery에서 내 기능이 작동하지 않습니다.

분류에서Dev

메일 기능이 PHP에서 작동하지 않습니다.

분류에서Dev

Onchange 기능이 Jquery에서 작동하지 않습니다.

분류에서Dev

JS 기능이 창에서 작동하지 않습니다.

분류에서Dev

onClick 기능이 본문에서 작동하지 않습니다.

분류에서Dev

onDeviceReady 기능이 PhoneGap 앱에서 작동하지 않습니다.

분류에서Dev

복제 기능이 "즉시"기능에서 작동하지 않습니다.

분류에서Dev

추가 기능이 변경 기능 jquery에서 작동하지 않습니다.

분류에서Dev

반응에서 이미지로 작동하지 않는 기능 필요

분류에서Dev

기본 반응 : ListView에가에서 Andriod 작동하지 않습니다

분류에서Dev

감속기가 redux 반응 js에서 작동하지 않습니다.

분류에서Dev

탐색 메뉴가 반응 형보기에서 작동하지 않습니다.

분류에서Dev

number.toLocaleString ()이 반응 네이티브에서 작동하지 않습니다.

분류에서Dev

compnonentDidMount에서 네이티브 setState 반응이 작동하지 않습니다.

분류에서Dev

반응에서 내 테이블 필터링이 작동하지 않습니다.

분류에서Dev

기본 변수에 해당하는 기능이 작동하지 않습니다.

분류에서Dev

ActivityIndicator가 반응 네이티브에서 작동하지 않습니다.

분류에서Dev

Turbolinks는 반응 네이티브 웹뷰에서 작동하지 않습니다.

분류에서Dev

반응 형 메뉴에서 최소 높이가 작동하지 않습니다.

분류에서Dev

"정렬"기능이 Python 작업에서 작동하지 않습니다.

분류에서Dev

GET 응답 후 문자열 분할 기능이 작동하지 않습니다.

분류에서Dev

FlexiGrid에서 JS 자동로드 기능이 작동하지 않습니다.

Related 관련 기사

  1. 1

    JavaScript에서 기능 반복이 작동하지 않습니다.

  2. 2

    "const isLoggedIn = props.isLoggedIn;"의 목적은 무엇입니까? 반응 빠른 시작 / 조건부 렌더링 문서에서와 같이?

  3. 3

    단순 onClick 반환 기능이 작동하지 않습니다.

  4. 4

    반품 확인 기능이 작동하지 않습니다.

  5. 5

    onclick 기능이 PHP에서 작동하지 않습니다.

  6. 6

    내 기능이 wordpress에서 작동하지 않습니다.

  7. 7

    Qt 5.2에서 qWait 기능이 작동하지 않습니다.

  8. 8

    jQuery에서 내 기능이 작동하지 않습니다.

  9. 9

    메일 기능이 PHP에서 작동하지 않습니다.

  10. 10

    Onchange 기능이 Jquery에서 작동하지 않습니다.

  11. 11

    JS 기능이 창에서 작동하지 않습니다.

  12. 12

    onClick 기능이 본문에서 작동하지 않습니다.

  13. 13

    onDeviceReady 기능이 PhoneGap 앱에서 작동하지 않습니다.

  14. 14

    복제 기능이 "즉시"기능에서 작동하지 않습니다.

  15. 15

    추가 기능이 변경 기능 jquery에서 작동하지 않습니다.

  16. 16

    반응에서 이미지로 작동하지 않는 기능 필요

  17. 17

    기본 반응 : ListView에가에서 Andriod 작동하지 않습니다

  18. 18

    감속기가 redux 반응 js에서 작동하지 않습니다.

  19. 19

    탐색 메뉴가 반응 형보기에서 작동하지 않습니다.

  20. 20

    number.toLocaleString ()이 반응 네이티브에서 작동하지 않습니다.

  21. 21

    compnonentDidMount에서 네이티브 setState 반응이 작동하지 않습니다.

  22. 22

    반응에서 내 테이블 필터링이 작동하지 않습니다.

  23. 23

    기본 변수에 해당하는 기능이 작동하지 않습니다.

  24. 24

    ActivityIndicator가 반응 네이티브에서 작동하지 않습니다.

  25. 25

    Turbolinks는 반응 네이티브 웹뷰에서 작동하지 않습니다.

  26. 26

    반응 형 메뉴에서 최소 높이가 작동하지 않습니다.

  27. 27

    "정렬"기능이 Python 작업에서 작동하지 않습니다.

  28. 28

    GET 응답 후 문자열 분할 기능이 작동하지 않습니다.

  29. 29

    FlexiGrid에서 JS 자동로드 기능이 작동하지 않습니다.

뜨겁다태그

보관