在ReactJS中登录首页后数据未刷新

Sag*_*dte 8 javascript reactjs

我将用户数据保存到localStorage登录组件中,然后重定向到主页。在首页中,用户名在首次访问时不会更新。我必须重新加载页面。然后,刷新后数据将绑定到页面。请帮助我如何在首次访问时显示数据?

下面是我的主页代码

import React, { Component } from 'react';
import { Link } from 'react-router-dom';

export default class Header extends Component {
  constructor(props) {
    super(props);
    this.state = {
      isLogin: false,
      isLogout: false,
      user: ""
    };
  }

  componentDidMount() {
    const userData = localStorage.getItem("userData");
    const user = JSON.parse(userData);
    this.setState({ user: user });
    if (userData) {
      this.setState({ isLogin: true });
    }
    console.log(userData);
    console.log(user);
  }

  logout = e => {
    e.preventDefault();
    localStorage.clear();
    this.setState({ isLogout: true });
  };

  render() {
    if (this.state.isLogin === false || this.state.isLogout === true) {
      return (
        <header
          id="kr-header"
          className="kr-header cd-auto-hide-header kr-haslayout"
        >
          <div className="container">
            <div className="row">
              <div className="col-xs-12 col-sm-12 col-md-12 col-lg-12">
                <strong className="kr-logo">
                  <Link to="/">
                    <img src="images/logo.png" alt="company logo here" />
                  </Link>
                </strong>
                <nav className="kr-addnav">
                  <ul>
                    <li>
                      <Link
                        id="kr-btnsignin"
                        className="kr-btn kr-btnblue"
                        to="login_register"
                      >
                        <i className="icon-smiling-face" />
                        <span>Join Now</span>
                      </Link>
                    </li>
                    <li>
                      <a
                        className="kr-btn kr-btngreen"
                        href="dashboardaddlisting.html"
                      >
                        <i className="icon-plus" />
                        <span>Add Listing</span>
                      </a>
                    </li>
                  </ul>
                </nav>
                <nav id="kr-nav" className="kr-nav">
                  <div className="navbar-header">
                    <button
                      type="button"
                      className="navbar-toggle collapsed"
                      data-toggle="collapse"
                      data-target="#kr-navigation"
                      aria-expanded="false"
                    >
                      <span className="sr-only">Toggle navigation</span>
                      <span className="icon-bar" />
                      <span className="icon-bar" />
                      <span className="icon-bar" />
                    </button>
                  </div>
                  <div
                    id="kr-navigation"
                    className="collapse navbar-collapse kr-navigation"
                  >
                    <ul>
                      <li>
                        <a href="dashboard.html">Dasboard</a>
                      </li>
                    </ul>
                  </div>
                </nav>
              </div>
            </div>
          </div>
        </header>
      );
    } else {
      return (
        <header
          id="kr-header"
          className="kr-header cd-auto-hide-header kr-haslayout"
        >
          <div className="container">
            <div className="row">
              <div className="col-xs-12 col-sm-12 col-md-12 col-lg-12">
                <strong className="kr-logo">
                  <Link to="/">
                    <img src="images/logo.png" alt="company logo here" />
                  </Link>
                </strong>
                <nav className="kr-addnav">
                  <ul>
                    <li>
                      <Link
                        id="kr-btnsignin"
                        className="kr-btn kr-btnblue"
                        to="login_register"
                      >
                        <i className="icon-smiling-face" />
                        <span>{this.state.user.user.firstname}</span>
                      </Link>
                    </li>
                    <li>
                      <a
                        className="kr-btn kr-btngreen"
                        href="dashboardaddlisting.html"
                      >
                        <i className="icon-plus" />
                        <span>Add Listing</span>
                      </a>
                    </li>
                    <li>
                      <a onClick={this.logout} className="kr-btn kr-btngreen">
                        <i className="icon-plus" />
                        <span>Logout</span>
                      </a>
                    </li>
                  </ul>
                </nav>
                <nav id="kr-nav" className="kr-nav">
                  <div className="navbar-header">
                    <button
                      type="button"
                      className="navbar-toggle collapsed"
                      data-toggle="collapse"
                      data-target="#kr-navigation"
                      aria-expanded="false"
                    >
                      <span className="sr-only">Toggle navigation</span>
                      <span className="icon-bar" />
                      <span className="icon-bar" />
                      <span className="icon-bar" />
                    </button>
                  </div>
                  <div
                    id="kr-navigation"
                    className="collapse navbar-collapse kr-navigation"
                  >
                    <ul>
                      <li>
                        <a href="dashboard.html">Dasboard</a>
                      </li>
                    </ul>
                  </div>
                </nav>
              </div>
            </div>
          </div>
        </header>
      );
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

以下是登录注册组件代码

import React, {Component} from 'react';
import { Link,Redirect ,withRouter } from 'react-router-dom';
import PropTypes from "prop-types";
import Otp from './otp';
import axios from '../api';

export default class LoginRegister extends Component {
    static contextTypes = {
        router: PropTypes.object
      }
    constructor(props,context){
        super(props,context);
        this.state = {
            fname:'',
            lname:'',
            emailaddress:'',
            password:'',
            mobile:'',
            user:'',
            login_pass:'',
            isLogin:false
        }
        this.regi_data = this.regi_data.bind(this);
        this.login_data = this.login_data.bind(this);
        // this.otpModalRef = React.createRef();
    }

    regi_data(e){
        this.setState({[e.target.name] : e.target.value}
        );
    }
    login_data(e){
        this.setState({[e.target.name] : e.target.value})
    }

    // otpModalRef = ({onOpenModal}) => {
    //    this.showModal = onOpenModal;
    // }

    componentDidMount(){
        if (localStorage.getItem('userData')) {
            this.context.router.history.push({
                        pathname:'/',

                    });
        }
    }




    login = (e) => {
        e.preventDefault();
         axios.post('/api/signin', { 
                        user:this.state.user,
                        password:this.state.login_pass,
                    })
          .then(res => {
                //console.log(res);
                localStorage.setItem('userData', JSON.stringify(res.data));
                this.context.router.history.push({
                        pathname:'/',

                    });
//                  window.location.reload();
                    this.setState({isLogin: true});
          })
          .catch(function (error) {
            console.log(error.message);
          })
    }

    register = (e) => {
        e.preventDefault(); 
        axios.post('/api/user/add', { 
                        firstname: this.state.fname,
                        lastname:this.state.lname,
                        email:this.state.emailaddress,
                        password:this.state.password,
                        mobile:this.state.mobile 
                    },              
                )
          .then(res => {
                console.log(res);
                // this.showModal();
                 this.context.router.history.push({
                        pathname:'/otp_validate',
                    });            
          }).catch(function(error){
            alert(error.message)
          })
    }
Run Code Online (Sandbox Code Playgroud)

Anv*_*vay 5

问题

从你上面所示的代码,你所面临的问题,它看起来像你有一个共同的成分Header是从父组件渲染LoginHomePage可能是由中央应用程序组件,你必须也宣布了路线LoginHomepage。在这种情况下,您面临的问题是,当应用程序首次加载时,标头也会同时加载,并且其componentDidMount方法会被调用。但是由于此时您尚未登录,因此标头组件无法获取显示用户名所需的用户数据。以后,无论何时执行实际的登录操作,将数据存储在localstorage中并重定向到主页,都不会卸载和重新安装标头,因为它不在这些个人Login和管理员的范围内。Homepage 组件,因此它的componentDidMount事件将不会被触发,并且标头组件中也不会检测到任何更改。

固定

方法1:创建两个不同的Header组件,一个用于登录状态,一个用于注销状态,然后分别将它们放置在LoginHomePage组件的渲染方法中。在这种情况下,componentDidMount这些Header组件中写入的上述本地存储逻辑应正常工作。

方法2:将用户数据提升到Header组件的父级,并将用户数据作为道具传递给该组件。在这种情况下,您可以直接在Header'srender方法中使用该属性。


Muh*_*fiq 0

将这两行写在render()方法的顶部。像这样:

render() {
  const userData = localStorage.getItem("userData");
  const user = JSON.parse(userData);
  if (user) {
    return (...); // logged in ui
  } else {
    return (...); // logged out ui
  }
}
Run Code Online (Sandbox Code Playgroud)