获取React.createElement:使用setState

时间:2017-07-20 15:30:34

标签: javascript reactjs setstate

enter image description here

预期

点击登录按钮而不输入电子邮件或密码后,用户应该看到通知组件

结果

单击login后,调用setState将this.state.errors设置为true,并显示上面的错误消息。

handleSubmit函数

如果我删除了this.setState行,则不会发生任何事情,但我不会收到任何Chrome错误。但是我需要setState,所以我可以用它来显示通知(请参阅此块下面的代码)

handleLoginSubmit = this.handleLoginSubmit.bind(this);
handleLoginSubmit(e, user) {
  e.preventDefault();
  if (R.isNil(user.email)) return;

  // Log user in via Firebase
  firebase.auth().signInWithEmailAndPassword(user.email, user.password)
    .catch((err) => {
      if (err.code === 'auth/user-not-found') {
        console.log('need to create user')
        return this.createUser(user.email, user.password);
      } else {
        console.log('Incorrect email or password, please try again')

        this.setState({
          errors: true,
          errorMsg: 'Incorrect email or password, please try again'
        }, function () {
          console.log('>>> this.state', this.state);
        });
      }

      console.log('Completed')
    })
}

设置状态后我也没有看到console.log:

enter image description here

render() {
  return (
    <main>
      { this.state.errors ? <Notification/> : null }
      <Login handleLoginSubmit={ this.handleLoginSubmit }
             email={ this.state.email }
             password={ this.state.password } />
    </main>
  )
}

完整代码

import React, { Component } from 'react'
import { connect } from 'react-redux'
import { withRouter } from 'react-router-dom'
import * as R from 'ramda'
import * as firebase from 'firebase'

import { Login } from '../../components'
import { Notification } from '../../components'

export class LoginX extends Component {
    constructor(props) {
        super(props);
        this.state = {
            email: '',
            password: '',
            errors: false,
            errorMsg: ''
        }
        this.handleLoginSubmit = this.handleLoginSubmit.bind(this);
    }

    componentDidMount() {
    firebase.auth().onAuthStateChanged((user) => {
      this.checkAuth();
    })
  }

    componentDidUpdate(prevProps, prevState) {
      console.log('componentDidUpdate this.state', this.state)
    }

    checkAuth() {
    const user = firebase.auth().currentUser;

    if (!user) {
      return
    }
    else {
      if (!user.emailVerified) {
        // User has signed up, redirect them to verification
        this.props.history.push('/verification');
        return
      }
    }

    // User does not need to be authenticated.
    this.props.history.push('/dashboard');
  }

    handleLoginSubmit(e, user) {
        e.preventDefault();
        if (R.isNil(user.email)) return;

        // Log user in via Firebase
        firebase.auth().signInWithEmailAndPassword(user.email, user.password)
      .catch((err) => {
        if (err.code === 'auth/user-not-found') {
          console.log('need to create user')
          return this.createUser(user.email, user.password);
        }
        else {
          console.log('Incorrect email or password, please try again')

          this.setState({
            errors: true,
            errorMsg: 'Incorrect email or password, please try again'
          }, function() {
            console.log('>>> this.state', this.state);
          });
        }

        console.log('Completed')
      })
    }

    createUser(user, pass) {
    firebase.auth().createUserWithEmailAndPassword(user, pass)
      .then((user) => {
        console.log('verification email sent')
        // user.sendEmailVerification()
      })
      .catch((err) => {
        console.log(err)
        // this.setState({inProgress: false})
        switch (err.code) {
          case "auth/email-already-in-use": {
                        console.log('Account already exists, please log in')
            // this.setState({errorMsg: "Account already exists, please log in"});
            break;
          }
          case "auth/invalid-email": {
                        console.log('Invalid email address format (domain is automatically included)')
            // this.setState({errorMsg: "Invalid email address format (domain is automatically included)"});
            break;
          }
          case "auth/operation-not-allowed": {
                        console.log('Login system in unavailable, please contact the system administrator')
            // this.setState({errorMsg: "Login system in unavailable, please contact the system administrator"});
            break;
          }
        }
      })
  }

    render() {
        return (
            <main>
                { this.state.errors ? <Notification/> : null }
                <Login handleLoginSubmit={ this.handleLoginSubmit }
                       email={ this.state.email }
                       password={ this.state.password } />
            </main>
        )
    }
}

const mapStateToProps = (state) => {
    return {
        state
    }
}


const LoginContainer = LoginX;
export default connect(mapStateToProps)(withRouter(LoginContainer))

通知

有问题
import React from 'react'
import PropTypes from 'prop-types'

const Notifications = (props) => {

  return (
    <div className="notification">
      Notifications
    </div>
  );
}

export default Notifications

Notifications.propTypes = {

};

enter image description here

1 个答案:

答案 0 :(得分:2)

我认为这是一个错字,请使用Notifications代替Notification

import { Notifications } from '../../components';