Как применять 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, });
            }
        });
    }
Другие вопросы по тегам