代码之家  ›  专栏  ›  技术社区  ›  Mat.Now

Meteor用户在客户端始终未定义

  •  1
  • Mat.Now  · 技术社区  · 6 年前

    Meteor.user() 在客户端中未定义。你能帮我解释一下我是怎么做错的吗?

    class App extends Component {
    constructor(props){ 
        super(props);
    
        this.state = {
            verified: this.props.currentUser.emails[0].verified
        };
    }
    
    render(){
    
        return (
            <div>
                <Navbar collapseOnSelect fluid>
                    <nav className="sideBar-menu">
                        <div className="pull-right sidebar-right">
                            <ButtonToolbar className="pull-left sidebar-toolbar">
                                {!this.state.verified && <Button>Sign in</Button>}
                                {this.state.verified && <Button>Sign out</Button>}
                                <Button bsStyle="danger">Sign up</Button>
                            </ButtonToolbar>                    
                        </div>
                    </nav>
                </Navbar>            
            </div>
        )
      }
    }
    
    const dataHOC = withTracker((props)=>{
       return {
          currentUser: Meteor.user()
       }
    })(App);
    
    export default dataHOC
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Jankapunkt    6 年前

    Meteor.user() 仅在用户登录后返回当前用户的对象。因此,不能在上使用属性 currentUser 如果没有用户登录。

    因此,您的州可以使用两个值进行登录和验证:

     const currentUser = this.props.currentUser
     this.state = {
       loggedIn: currentUser,
       verified: currentUser && currentUser.emails[0].verified
     };
    

    然后渲染代码将显示 sign-in 元素,如果没有登录状态:

    <ButtonToolbar className="pull-left sidebar-toolbar">
      {!this.state.loggedIn && <Button>Sign in</Button>}          
      { this.state.loggedIn && <Button>Sign out</Button>}
      <Button bsStyle="danger">Sign up</Button>
    </ButtonToolbar>  
    

    然后你可以使用 verified 显示更多信息,如用户尚未验证的通知,并仅显示已验证用户的内容。

    安全说明: 请注意,这只是UI糖果,如果您真的想阻止未经验证的用户订阅数据或调用某些方法/更新数据,您应该始终检查 user.emails[i].verified