【问题标题】:Can't reach user data field, console says can't find user of undefined无法到达用户数据字段,控制台说找不到未定义的用户
【发布时间】:2019-10-07 19:53:08
【问题描述】:

我想在页面左侧显示记录的用户名。 当我尝试访问用户 displayName 时,它​​说它无法找到未定义的值。有人可以解释我为什么吗?

我尝试了componentDidMount和其他一些方法,但是这里渲染的时候好像有问题

componentDidMount() {
        firebase.auth().onAuthStateChanged(user => {
            // If firebase has detect a user
            if (user) {
                this.props.setUser(user);
                this.props.history.push("/");

这是文件

class UserPanel extends React.Component {

    state = {
        user: null
    }


    componentDidMount(){
        this.setState({ user: this.props.currentUser })
    }



    dropdownOptions = () => [
        {
            key: "user",
            text: (
                <span>
                    Sign in as <strong>{this.state.user && this.state.user.displayName}</strong>
                </span>
            ),
            disabled: true
        },
        {
            key: "avatar", 
            text: <span>Change Avatar</span>
        },
        {
            key: "signout",
            // Set a signout Function to enable user to sign out of the chat
            text: <span onClick={event => this.handleSignOut(event)}>SignOut</span>
        }
    ];

    handleSignOut = (event) => {
        // You need to prevent form submission. Use event.preventDefault() in your handle submit function.
        event.preventDefault();
        firebase
            .auth()
            .signOut()
            .then(() => console.log("See you"));
    } 


    render(){

        console.log(this.props.currentUser);

// !this.state.currentUser ? <Spinner /> :
        return (
            <Grid style={{ background: '#4c3c4c' }}>
                <Grid.Column>
                    <Grid.Row style={{ padding: '1.2rem', margin: 0 }}>
                        <Header inverted floated='left' as='h2'>
                            <Icon name='code' />
                            <Header.Content>VirtualChat</Header.Content>
                        </Header>
                    </Grid.Row>


                    {/* User Dropdown Choices */}
                    <Header style={{ padding: "0.25em" }} as="h4" inverted>
                        <Dropdown 
                        trigger={<span>{this.state.user.displayName}</span>}
                        options={this.dropdownOptions()}
                        />
                    </Header>
                </Grid.Column>
            </Grid>
        )
    }
}


const mapStateToProps = state => ({
    currentUser: state.user.currentUser
})


export default connect(mapStateToProps)(UserPanel);

【问题讨论】:

    标签: reactjs firebase-authentication undefined render


    【解决方案1】:

    在您的代码中,this.state.user 直到 componentDidMount() 之后才成为真值,直到第一次渲染之后才会生效。在初始渲染期间,您尝试访问尚不存在的对象中的值。

    你可以做的是实现一个条件来检查this.state.user是否有效,否则显示一个空字符串。组件重新渲染的速度非常快,因此您甚至不会注意到首次渲染时的空字符串。

     <Header style={{ padding: "0.25em" }} as="h4" inverted>
        <Dropdown 
            trigger={<span>{this.state.user ? this.state.user.displayName : ""}</span>}
            options={this.dropdownOptions()}
        />
     </Header>
    

    【讨论】:

    • 我之前尝试过,但它总是做假情况,只是启动页面而不显示数据。即使使用 console.log 也无法显示用户数据
    猜你喜欢
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 2012-07-25
    相关资源
    最近更新 更多