React函数不返回任何值

时间:2016-12-26 05:55:40

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

我目前正在使用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呈现时,&#34; name&#34;即使getUserName()函数打印出全名,变量也是未定义的。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:2)

您的方法getUserName()实际上并没有返回任何内容,因此当您尝试将其返回值分配给name - 变量时,就像这个var name = this.getUserName();一样,您就是这样做的。我总是将name设置为undefined

正如Shailesh Prajapati建议的那样,您应该在组件状态中设置名称。我甚至会说,你应该使用像Redux这样的东西将它分离出来。此外,您不应该在this.getUserName()函数内调用render(),因为它可能(并且很可能会)对性能非常不利。

这里是代码,包含所有建议:

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>
    );
}

答案 1 :(得分:1)

你必须使用State而不是variable.Store名称值在this.SetState({name: value})中,并直接使用this.state.name在任何你想要使用的地方......

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