A simple store, login, logout, and access to users in the current session
class UserStore {
@observable
detail = {};
@observable
userInfoId;
@observable
nickName;
@action
doLogin = (data) => {
const _this = this;
return axios.post("/login", data).then(resp => {
if(resp.success && resp.data) {
message.success(`${resp.data.nickName}`);
_this.detail = resp.data;
_this.userInfoId = resp.data.userInfoId;
_this.nickName = resp.data.nickName;
}
return resp;
});
}
@action
doLogout = () => {
const _this = this;
return axios.post("/logout").then(resp => {
if(resp.success) {
message.success("");
_this.detail = {};
_this.userInfoId = "";
_this.nickName = "";
}
return resp;
});
}
@action
doFetch = () => {
const _this = this;
return axios.get("/user-info/current").then(resp => {
if(resp.success && resp.data) {
_this.detail = resp.data;
_this.userInfoId = resp.data.userInfoId;
_this.nickName = resp.data.nickName;
}
return resp;
});
}
}
after configuring configure ({enforceActions: "observed"})
,
login and logout will report an error, which is prevented from updating
mobx.module.js?daf9:98 Uncaught (in promise) Error: [mobx] Since strict-mode is enabled, changing observed observable values outside actions is not allowed. Please wrap the code in an `action` if this change is intended. Tried to modify: UserStore@3.userInfoId
at invariant$$1 (mobx.module.js?daf9:98)
at fail$$1 (mobx.module.js?daf9:93)
at checkIfStateModificationsAreAllowed$$1 (mobx.module.js?daf9:1075)
at ObservableValue$$1.prepareNewValue (mobx.module.js?daf9:686)
at ObservableObjectAdministration$$1.write (mobx.module.js?daf9:3509)
at UserStore.set [as userInfoId] (mobx.module.js?daf9:3732)
at eval (UserStore.jsx?3e72:105)
then try to take each field out:
@action
updateUserInfoId(userInfoId) {
this.userInfoId = userInfoId;
}
@action
updateDetail(detail) {
this.detail = detail;
}
@action
updateNickName(nickName) {
this.nickName = nickName;
}
@action
doLogin = (data) => {
const _this = this;
return axios.post("/login", data).then(resp => {
if(resp.success && resp.data) {
message.success(`${resp.data.nickName}`);
//_this.detail = resp.data;
//_this.userInfoId = resp.data.userInfoId;
//_this.nickName = resp.data.nickName;
_this.updateUserInfoId(resp.data.userInfoId);
_this.updateDetail(resp.data);
_this.updateNickName(resp.data.nickName);
}
return resp;
});
}
you can update successfully this time.
I don"t quite understand what"s wrong with updating directly in doLogin. The strange thing about
is that the doFetch method can be updated successfully.