gpt4 book ai didi

Meteor/React - 如何等待 Meteor.user()

转载 作者:行者123 更新时间:2023-12-04 07:18:39 26 4
gpt4 key购买 nike

我正在努力弄清楚如何等待 Meteor.user()在 react 组件中订阅。我知道用户已登录,因为 Meteor.userId()返回 _id ,但尝试访问电子邮件地址显示 Meteor.user()返回未定义。我猜是因为它还没有可用。

唉,由于 Meteor.user() 不是我手动订阅的发布,我不确定如何在 React 组件中等待它。有人可以指出我的例子吗?

import { Meteor } from 'meteor/meteor';
import React from 'react';
import { Link } from 'react-router';
import { createContainer } from 'meteor/react-meteor-data';

import './BaseLayout.scss';


class BaseLayout extends React.Component {

constructor(props) {
super(props);

this.state = {
isAuthenticated: (Meteor.userId() !== null) ? true : false,
}
}

componentWillMount() {
if (!this.state.isAuthenticated) {
this.context.router.push('/login');
}
}

componentDidUpdate(prevProps, prevState) {
if (!this.state.isAuthenticated) {
this.context.router.push('/login');
}
}

toggleUserMenu() {
this.refs.userMenu.style.display = (this.refs.userMenu.style.display === 'block') ? 'none' : 'block';
}

logout(e) {
e.preventDefault();
Meteor.logout();
this.context.router.push('/login');
}

render() {
return(
<div id="base">
<div id="header">
<div id="top-bar" className="clear-fix">
<div className="float-left" id="logo"></div>
<div className="float-right" id="user-menu">
<div onClick={this.toggleUserMenu.bind(this)}>
<span>{this.props.currentUser.emails[0].address}</span>
<div className="arrow-down"></div>
</div>
<div id="user-menu-content" ref="userMenu">
<a onClick={this.logout.bind(this)}>Sign Out</a>
</div>
</div>
</div>
</div>
<div id="bodyContainer">
{this.props.children}
</div>
<div id="footer">
<ul>
<li><a href="mailto:test@example.com">Made by Us</a></li>
</ul>
</div>
</div>
)
}
}
BaseLayout.contextTypes = {
router: React.PropTypes.object.isRequired,
}


export default BaseLayoutContainer = createContainer(() => {

var handle = Meteor.subscribe("user.classrooms");

return {
currentUser: Meteor.user(),
dataLoading: !handle.ready(),
classrooms: Classrooms.find({}).fetch(),
};
}, BaseLayout);

最佳答案

您可以使用三元运算

currentUser ? true : flase

保持组件井井有条的另一个重要提示是始终 destructure例如,而不是做 const currentUser = this.props.currentUser你可以做 const { currentUser } = this.props;看一看:
render() {
const { currentUser, children } = this.props;
return (
<div id="base">
<div id="header">
<div id="top-bar" className="clear-fix">
<div className="float-left" id="logo"></div>
<div className="float-right" id="user-menu">
<div onClick={this.toggleUserMenu.bind(this)}>
{currentUser ?
<span>{currentUser.emails[0].address}</span> :
<span>Loading...</span>
}
<div className="arrow-down"></div>
</div>
<div id="user-menu-content" ref="userMenu">
<a onClick={this.logout.bind(this)}>Sign Out</a>
</div>
</div>
</div>
</div>
<div id="bodyContainer">
{children}
</div>
<div id="footer">
<ul>
<li><a href="mailto:test@example.com">Made by Us</a></li>
</ul>
</div>
</div>
)
}

关于Meteor/React - 如何等待 Meteor.user(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39560279/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com