Невозможно использовать реквизит Redux в результатах перенаправления Firebase - PullRequest
0 голосов
/ 14 января 2020

Я пытаюсь построить аутентификацию Google в React + Redux + Firebase. И я хочу создать пользователя после аутентификации Google. Но this.props.createUser() не работает после перенаправления в Firebase.

TypeError: Невозможно прочитать свойства 'props' из неопределенного

app / src / components / home . js

import React, { Component } from "react";
import { connect } from "react-redux";
import firebase from "../config/firebase";
import { createUser } from "../actions";

class Home extends Component {
  constructor(props) {
    super(props);

    this.state = {
      user: null
    };
  }

  async componentWillMount() {
    console.log("this", this.props);
    firebase.auth().onAuthStateChanged(user => {
      this.setState({ user });

      if (user) {
        this.props.history.push("/user/settings");
      }
    });

    firebase
      .auth()
      .getRedirectResult()
      .then(function(result) {
        if (result.credential) {
          var token = result.credential.accessToken;
          console.log("token", token);
        }
        var user = result.user;
        // Successfully got a user but type error in below
        this.props.createUser(user);
      })
      .catch(function(error) {
        console.log("error", error);
      });
  }

  onLogin = () => {
    const provider = new firebase.auth.GoogleAuthProvider();
    firebase.auth().signInWithRedirect(provider);
  };

  render() {
    return (
      <button className="btn btnPrimary" onClick={this.onLogin}>
        <span>Google Signin</span>
      </button>
    );
  }
}

function mapStateToProps({ user }) {
  return { user: user };
}

export default connect(mapStateToProps, { createUser })(Home);

app / src / actions / index. js

import firebase from "../config/firebase";

export function createUser(user) {
  console.log('user', user)
}

Ответы [ 2 ]

1 голос
/ 14 января 2020

Поскольку вы объявляете обратный вызов с ключевым словом function, this внутри функции относится к самой функции, а не к классу, в котором вы объявили метод componentWillMount.

Самое простое решение использовать жирную стрелку, как вы уже делали в другом месте:

firebase
  .auth()
  .getRedirectResult()
  .then((result) => {
    if (result.credential) {
      var token = result.credential.accessToken;
      console.log("token", token);
    }
    var user = result.user;
    // Successfully got a user but type error in below
    this.props.createUser(user);
  })

Также посмотрите этот ответ о причине проблемы и других решениях: Как получить доступ к правильному `this` внутри Обратный вызов

0 голосов
/ 14 января 2020

Вам необходимо использовать функцию стрелки здесь:

firebase
  .auth()
  .getRedirectResult()
  .then(function(result) {
    if (result.credential) {
      var token = result.credential.accessToken;
      console.log("token", token);
    }
    var user = result.user;
    // Successfully got a user but type error in below
    this.props.createUser(user);
  })
  .catch(function(error) {
    console.log("error", error);
  });

должно быть:

firebase
  .auth()
  .getRedirectResult()
  .then((result) => {
    if (result.credential) {
      var token = result.credential.accessToken;
      console.log("token", token);
    }
    var user = result.user;
    // Successfully got a user but type error in below
    this.props.createUser(user);
  })
  .catch(function(error) {
    console.log("error", error);
  });

Ключевое слово function() {} съедает ваше значение this.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...