如何申请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, });
            }
        });
    }