如何申请Tracker.autorun? Meteor.userId() 刷新页面后未定义
How to apply Tracker.autorun? Meteor.userId() undefined right after refreshing page
我有一个使用 Meteor.userId() 和角色的受限页面:
class AdminPage extends Component {
render() {
return (
<div>
{
Roles.userIsInRole(Meteor.userId(), 'admin') ? (
<Master_Layout renderCenter={<Article_Editor />}/>
) : browserHistory.push('/')
}
</div>
)
}
}
此代码在刷新后将用户重定向到“/”,因为 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>
}
}
}
观察到需要的部分:
$这个=这个;
用户=Meteor.user(); //Meteor.userId() 不起作用。
删除了 browserHistory,因为它会在定义用户之前离开。
现在我只需要找到在渲染装载之前定义 user/userId 的解决方案。
Tracker.autorun
允许您在依赖反应数据源发生变化时自动调用函数。
简单来说,Tracker.autorun()
接受一个函数作为输入,现在运行这个函数,然后 returns 每当数据源发生变化时。
在您的情况下,您可以使用 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, });
}
});
}
我有一个使用 Meteor.userId() 和角色的受限页面:
class AdminPage extends Component {
render() {
return (
<div>
{
Roles.userIsInRole(Meteor.userId(), 'admin') ? (
<Master_Layout renderCenter={<Article_Editor />}/>
) : browserHistory.push('/')
}
</div>
)
}
}
此代码在刷新后将用户重定向到“/”,因为 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>
}
}
}
观察到需要的部分:
$这个=这个;
用户=Meteor.user(); //Meteor.userId() 不起作用。
删除了 browserHistory,因为它会在定义用户之前离开。
现在我只需要找到在渲染装载之前定义 user/userId 的解决方案。
Tracker.autorun
允许您在依赖反应数据源发生变化时自动调用函数。
简单来说,Tracker.autorun()
接受一个函数作为输入,现在运行这个函数,然后 returns 每当数据源发生变化时。
在您的情况下,您可以使用 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, });
}
});
}