javascript - React+Next.js+Firebase :Auth URL changes to username and password after signInWithEmailAndPassword

标签 javascript reactjs firebase url next.js

我正在使用 React + Next.js + Firebase.Auth。我有一份电子邮件和密码表格。提交时,它调用 onSubmit 方法并成功在控制台中显示 "onSubmit",user 。但是“After”没有显示在控制台中。此外,URL 会更改为用于身份验证的电子邮件和密码。

ex)http://localhost:3000/signin?email=aaa@gmail.com&password=abc123

它还会抛出(TypeError): Cannot read property 'setState' of undefined inside onAuthStateChanged

import React, { Component } from 'react'
import { SignUpLink } from '../SignUp';
import { Button } from 'antd';
import { connect } from 'react-redux'
import { firebase } from '../../Firebase'

const SignInPage = () => (
  <div>
    <h1>SignIn</h1>
    <SignInForm />
    <SignUpLink />
  </div>
);

const INITIAL_STATE = {
  email: '',
  password: '',
  error: null,
  user: null
};

async function onSignInButton () {
  console.log("Sign In Butrton")
  console.log("Sign In Done")
}

const SignInButton = () => (
  <Button type="primary" onClick={onSignInButton}>
    Sign In
  </Button>
);


class SignInFormBase extends Component {
  static async getInitialProps ({ Component, ctx }) {

    const pageProps = Component.getInitialProps ? await Component.getInitialProps(ctx) : {};

    return { pageProps };
  }

  constructor(props) {
    super(props)
    this.state = { ...INITIAL_STATE }
  }

  onSubmit = (event) => {
    console.log("onSubmit", this.state)
    firebase.auth.signInWithEmailAndPassword(this.state.email, this.state.password)
      .catch(function (error) {
        // Handle Errors here.
        var errorCode = error.code
        var errorMessage = error.message
        console.log(errorMessage)
        // ...
      });
    firebase.auth.onAuthStateChanged(function (user) {
      if (user) {
        //
        this.setState({ user: user })
        console.log("User", this.state.user)
      } else {
        // Handle error
      }
    })
    console.log("After")
    event.preventDefault();
  };

  onChange = event => {
    this.setState({ [event.target.name]: event.target.value })
  };

  render () {
    const { email, password, error } = this.state;

    const isInvalid = password === '' || email === ''

    return (
      <form onSubmit={this.onSubmit}>
        <input
          name="email"
          value={email}
          onChange={this.onChange}
          type="text"
          placeholder="Email Address"
        />
        <input
          name="password"
          value={password}
          onChange={this.onChange}
          type="password"
          placeholder="Password"
        />
        <button disabled={isInvalid} type="submit">
          Sign In
        </button>
        {error && <p>{error.message}</p>}
      </form>
    );
  }
}

最佳答案

范围

this 不在正确的上下文中,因为您使用关键字 function 声明了一个匿名函数。当您执行此操作时,您将创建一个新范围。这意味着 this 关键字表示“此函数”而不是“此 react 类”。

要避免这种情况,请使用箭头函数 () => {}

这些函数传递this

更改此

firebase.auth.onAuthStateChanged(function (user) {
      if (user) {
        //
        this.setState({ user: user })
        console.log("User", this.state.user)
      } else {
        // Handle error
      }
    })

到此

firebase.auth.onAuthStateChanged((user) => {
      if (user) {
        //
        this.setState({ user: user })
        console.log("User", this.state.user)
      } else {
        // Handle error
      }
    })

关于javascript - React+Next.js+Firebase :Auth URL changes to username and password after signInWithEmailAndPassword,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58769505/

相关文章:

javascript - Express 不发送最终回复

javascript - 在 AngularJS 中使用 UIBootstrap 实现动态分页

javascript window.location 和 IE session 变量丢失

javascript - FabricJS ReactJS CORS 错误

reactjs - node_modules/@types/react-dom/.... 错误。后续变量声明必须具有相同的类型。变量 'a'

javascript - 具有依赖 AJAX 调用的嵌套 Select2

wordpress - WordPress的古腾堡: React components on front end

firebase - 登录/注册后获取和存储用户数据

java - 安卓火力地堡 : How to get a list of object from inside an object

java - Android Studio 和 Firebase : Show ImageView on Full Screen