【问题标题】:React function not returning any value反应函数不返回任何值
【发布时间】:2016-12-26 16:36:27
【问题描述】:

我目前正在使用 firebase 使用某个用户的名字和姓氏来填充网站,但由于某种原因它无法正常工作。

getUserName(){
    firebaseAuth().onAuthStateChanged((user) => {
        if(user){
            // var name = ref.ref('users/' + user.uid).once('value').then((snapshot) => console.log(snapshot.val().displayName));
            var name = user.displayName;
            console.log("name in function: " + name); //prints full name
            return name;
        }
    });
}


render() {
    var name = this.getUserName();
    console.log("name: " + name); //prints undefined
    return (
        <div className="col-sm-6 col-sm-offset-3">
            <h1> Welcome {this.getUserName()} asdfasd </h1>
        </div>
    );
}

这是我的两个功能。出于某种原因,当我在两种情况下都打印出 name 变量时,我得到了两个不同的变量。在 getUserName() 中,它打印出用户的全名,然后我返回该值。当 DOM 呈现时,“name”变量未定义,即使 getUserName() 函数打印出全名。任何帮助将不胜感激!

【问题讨论】:

  • 改为console.log("name: ", this.getUserName()) 时会打印什么?

标签: javascript reactjs ecmascript-6 firebase-realtime-database


【解决方案1】:

您的方法getUserName() 实际上并没有返回任何东西,所以当您尝试将其返回值分配给name 变量时,例如var name = this.getUserName();,您总是只需将name 设置为@987654325 @。

正如 Shailesh Prajapati 所建议的,您应该在组件状态中设置名称。我什至会争辩说,您应该使用 Redux 之类的东西将其分离为全局状态。此外,您不应在 render() 函数中调用 this.getUserName(),因为它可能(并且很可能会)对性能非常不利。

这是代码,建议的所有内容:

componentWillMount(){
    this.getUserName();
}

getUserName(){
    firebaseAuth().onAuthStateChanged((user) => {
        if(user){
            var name = user.displayName;
            this.setState({ name: name });
        }
    });
}

render() {
    return (
        <div className="col-sm-6 col-sm-offset-3">
            <h1> Welcome {this.state.name} asdfasd </h1>
        </div>
    );
}

【讨论】:

    【解决方案2】:

    您必须使用 State 而不是变量。将名称值存储在 this.SetState({name: value}) 中,并在您想使用的任何地方直接使用 this.state.name...

    局部变量无法从外部函数访问,因此您必须使用状态来响应访问函数外部的状态/变量..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-26
      • 2021-02-12
      • 1970-01-01
      • 2012-11-27
      • 1970-01-01
      • 2022-08-16
      • 1970-01-01
      相关资源
      最近更新 更多