Я новичок в Mobx и reactjs в целом, у меня есть знания в Redux и я реагирую нативно, а в Redux, когда я использовал для вызова действия и обновления реквизита, запускается метод жизненного цикла componentDidUpdate
.
У меня сейчас сценарий входа в систему. поэтому пользователь заполняет форму, нажимает кнопку «Отправить», а отправка вызывает действие Mobx (асинхронно), и когда сервер отвечает, наблюдаемый объект обновляется, а затем он переходит на главную страницу (навигация происходит в компоненте).
Вот код моего магазина.
import { autorun, observable, action, runInAction, computed, useStrict } from 'mobx';
useStrict(true);
class LoginStore {
@observable authenticated = false;
@observable token = '';
@computed get isAuthenticated() { return this.authenticated; }
@action login = async (credentials) => {
const res = await window.swaggerClient.Auth.login(credentials)l
// checking response for erros
runInAction(() => {
this.token = res.obj.token;
this.authenticated = true;
});
}
}
const store = new LoginStore();
export default store;
export { LoginStore };
и этот обработчик находится в моем компоненте.
handleSubmit = (e) => {
e.preventDefault();
this.props.form.validateFields((err, values) => {
if (!err) {
this.props.store.login(values);
}
});
}
componentDidUpdate() {
if (this.props.store.isAuthenticated) {
const cookies = new Cookies();
cookies.set('_cookie_name', this.props.store.token);
this.props.history.push('main');
}
}
Это не идеальный код, я просто экспериментирую, но не совсем понимаю.
Кроме того, если я использую вычисленное значение (isAuthenticated)
в методе жизненного цикла render
, запускается componentDidUpdate
, но если я не использовал его в методе render
, componentDidUpdate
не запускается. Например, если я сделаю это
render() {
if (this.props.store.isAuthenticated) return null
// .... rest of the code here
}
приведенное выше вызовет componentDidUpdate.
Я что-то упускаю? есть ли лучший способ сделать это с помощью Mobx? Спасибо