私はMobxとreactjsを初めて使いました。私はReduxで知識を持っていてネイティブに反応しています。ライフサイクルメソッドがトリガーされます。反応するMobxのcomponentDidUpdateは観測可能な変更をしても更新されていません
私が今行っているシナリオはログインです。ユーザーがフォームを塗りつぶし、submitをクリックし、submitがMobxアクション(非同期)を呼び出し、サーバーが応答すると、observableが更新され、メインページに移動します(ナビゲーションはコンポーネント内で行われます)。
私のストアコードはここにあります。
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');
}
}
これは理想的なコードではありません。私は実験していますが、それほど得意ではありません。また
、私はrender
ライフサイクル法で計算値(isAuthenticated)
を使用する場合、componentDidUpdate
がトリガされますが、私はcomponentDidUpdate
がトリガされていない、render
方法でそれを使用しなかった場合。例えば 、私はこの
render() {
if (this.props.store.isAuthenticated) return null
// .... rest of the code here
}
を行う場合は、上記のcomponentDidUpdateをトリガします。
何か不足していますか? Mobxでもっと良い方法がありますか? ありがとう
最後のレンダーで参照解除されたオブザーバブルが変更されると、オブザーバのリアクションコンポーネントが再レンダリングされます。おそらく、このロジックをビューから切り離して配置するほうがよいでしょうか? – Tholle
@Tholleええ、確かにロジックはビューから分離する必要があります。私はmobxを実験しています。このケースについて具体的に知りたいと思っていました。 提案していただきありがとうございます:) –