【问题标题】:Why does my function not recognise my other function in react?为什么我的功能在反应中无法识别我的其他功能?
【发布时间】:2016-11-25 12:18:33
【问题描述】:

为什么会出现错误:Uncaught ReferenceError: writeUserData is not defined(…)

或当我包含 this.writeUserData 时出现其他错误,即:Cannot read property 'writeUserData' of undefined

该函数仍将正确的数据发布到 firebase,为什么它会抱怨? 更重要的是,在另一个函数中调用函数的正确方法是什么。我认为这是正确的做法吗?

signUserUp(){
    let name = this.state.nameValue;
    let slackName = this.state.slackNameValue;
    let email = this.state.emailValue;
    let password = this.state.passwordValue;
    firebase.auth().createUserWithEmailAndPassword(email, password).then(
      function(result){
        writeUserData(name, result.uid, email, slackName);
      },
      function(error){
        let errorCode = error.code;
        let errorMessage = error.message;
        console.log(errorMessage, '***');
        console.log(errorCode, 'code');
        });
    };

    writeUserData(name, useruid, email, slackName){
      firebase.database().ref('/pairs/' + useruid).set({
        name: name,
        useruid: useruid,
        email: email,
        slackName: slackName
      });
    }

编辑:此代码位于使用 ES6 语法的 React 组件内...

【问题讨论】:

    标签: javascript reactjs firebase firebase-realtime-database


    【解决方案1】:

    你只需要将它声明为一个函数:

    function writeUserData(name, useruid, email, slackName){...};
    

    您认为它成功只是因为createUserWithEmailAndPassword() 创建了您的用户,并且只有在此之后才调用成功处理程序。

    但在您的情况下实际上从未执行过:

    firebase.database().ref('/pairs/' + useruid).set
    

    【讨论】:

    • 但是我使用 ES6 语法在 React 组件中声明它是正确的方法吗?
    【解决方案2】:

    对于您的第一个问题:原因是您没有将writeUserData 声明为函数。

    这是一种类似于 Alexey Soshin 的回答的方式,但使用了另一种语法。

    var signUserUp = function() {
        let name = this.state.nameValue;
        let slackName = this.state.slackNameValue;
        let email = this.state.emailValue;
        let password = this.state.passwordValue;
    
        firebase.auth().createUserWithEmailAndPassword(email, password).then(
        function(result){
            writeUserData(name, result.uid, email, slackName);
        },
        function(error){
            let errorCode = error.code;
            let errorMessage = error.message;
            console.log(errorMessage, '***');
            console.log(errorCode, 'code');
        });
    };
    
    var writeUserData = function (name, useruid, email, slackName) {
        firebase.database().ref('/pairs/' + useruid).set({
            name: name,
            useruid: useruid,
            email: email,
            slackName: slackName
        });
    }

    对于您的第二个问题(“...当我包含 this.writeUserData ...Cannot read property 'writeUserData' of undefined”):在这种情况下,this 未定义。

    要为您的第二个问题定义this,您必须在this 中定义您的writeUserData

    this 内定义writeUserData

    1. 将其添加到父函数的原型上

      signUserUp.prototype.writeUserData = function(name, useruid, email, slackName) { ... }
      
    2. 将父函数的this绑定到子函数

      firebase.auth().createUserWithEmailAndPassword(email, password).then( ... ).bind(this);
      
    3. 将子函数的this绑定到你的函数

      function(result) { ... }.bind(this),
      

    ...这很尴尬。所以就用第一种方法吧! :)

    var signUserUp = function() {
      let name = this.state.nameValue;
      let slackName = this.state.slackNameValue;
      let email = this.state.emailValue;
      let password = this.state.passwordValue;
    
      signUserUp.prototype.writeUserData = function(name, useruid, email, slackName) {
        firebase.database().ref('/pairs/' + useruid).set({
          name: name,
          useruid: useruid,
          email: email,
          slackName: slackName
        });
      }
    
      firebase.auth().createUserWithEmailAndPassword(email, password).then(
        function(result) {
          this.writeUserData(name, result.uid, email, slackName);
        }.bind(this),
        function(error) {
          let errorCode = error.code;
          let errorMessage = error.message;
          console.log(errorMessage, '***');
          console.log(errorCode, 'code');
        }).bind(this);
    };

    【讨论】:

    • 我在 React 组件中声明了它,这就是 ES6 声明函数的方式吧?
    • 嗯...看起来您确实在考虑 ES6 类 (developer.mozilla.org/en/docs/Web/JavaScript/Reference/Classes)。我需要多读一点……
    • 据我所知,ES6 类在定义它们时不需要 function 关键字
    • @theworm 你是对的......但我认为你需要 class 关键字。
    • 我在顶部有这行 class PairSwitching extends React.Component{
    猜你喜欢
    • 1970-01-01
    • 2021-01-11
    • 2015-04-18
    • 2019-02-17
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多