Как применять Tracker.autorun? Meteor.userId() не определен сразу после обновления страницы
У меня есть ограниченная страница, использующая 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>
}
}
}
Соблюдаются необходимые детали:
$ это = это;
user = Meteor.user (); //Meteor.userId() не работает.
удален browserHistory, потому что он будет перемещаться до определения пользователя.
Теперь мне просто нужно найти решение по определению user/userId перед рендерингом монтирования.
1 ответ
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, });
}
});
}