我使用Meteor.userId()和角色限制页面:
class AdminPage extends Component {
render() {
return (
<div>
{
Roles.userIsInRole(Meteor.userId(), 'admin') ? (
<Master_Layout renderCenter={<Article_Editor />}/>
) : browserHistory.push('/')
}
</div>
)
}
}
此代码将用户重定向到&#34; /&#34;刷新后因为Meteor.userId()未定义。在刷新后呈现页面之前,如何确保未定义Meteor.userId()?
我搜索了答案。我发现Tracker.autorun是一个解决方案,但我不明白如何应用它。
谢谢你的帮助。我更新了代码:
constructor(props) {
super(props);
this.state = { user: '' };
}
componentDidMount() {
var $this = this;
Tracker.autorun(function () {
let user = Meteor.user();
if(user != undefined) {
$this.setState({ user: user });
}
});
}
render() {
if(Roles.userIsInRole(this.state.user, 'admin')) {
return (
<div>
<Master_Layout renderCenter={<Article_Editor />} />
</div>
)
} else {
return <div>loading...</div>
}
}
}
观察到所需部分:
$ this = this;
user = Meteor.user(); //Meteor.userId()不起作用。
删除了browserHistory,因为它会在定义用户之前导航。
现在我只需要在渲染安装之前找到定义user / userId的解决方案。
答案 0 :(得分:2)
Tracker.autorun
允许您在依赖的响应数据源发生变化时自动调用函数。
简单来说,Tracker.autorun()
将函数作为输入,现在运行此函数,并在数据源稍后更改时返回。
在您的情况下,您可以使用Tracker.autorun()
来跟踪用户文档,因为Meteor.user()
和Meteor.userId()
是被动的。在componentDidMount()
调用Tracker.autorun()
并在用户文档发生更改时将其保存在其他位置。
希望以下代码段有助于:
componentDidMount() {
var context = this;
Tracker.autorun(function(){
let user = Meteor.user();
if (user != undefined) {
context.setState({ user: user, });
}
});
}