Я столкнулся с проблемой, когда мои наблюдаемые в хранилище MobX продолжают сбрасываться при навигации по маршруту/загрузке компонента. Сценарий следующий: пользователь выбирает учетную запись и сохраняет ее в selectedAccount
наблюдаемой.
selectedAccount
будет обработан компонентом защиты, который проверяет, была ли выбрана учетная запись или нет. В противном случае пользователь должен выбрать учетную запись и будет перенаправлен на страницу приветствия, использующую компонент защиты. Но при навигации selectedAccount
сбрасывается на пустой объект, и, следовательно, компонент защиты перенаправляет обратно на страницу выбора учетной записи.
Мне интересно, имеет ли это какое-то отношение к инициализации хранилища, в котором хранится selectedAccount
:
export interface IUserStore {
users: any;
singleUser: any;
selectedAccount: any;
getUsers(): Promise<void>;
createUser(obj: any): any;
selectAccount(obj: any): any;
getSingleUser(id: string): Promise<void>;
updateUser(obj: any): any;
}
export class UserStore implements IUserStore {
@observable users: any = [];
@observable singleUser: any = {};
@observable selectedAccount: any = {};
@observable state = "pending"; // "pending" / "done" / "error"
Компонент защиты:
interface AppProps extends RouteProps {
userStore: IUserStore
}
@inject('userStore')
@observer
export class AccountRequired extends Route<any> {
public render() {
if (Object.keys(this.props.userStore.selectedAccount).length == 0) {
const renderComponent = () => (<Redirect to = {{pathname: "/selectAccount"}}/>);
return <Route {...this.props} component = {renderComponent} render = {undefined}/>;
} else {
return <Route {...this.props}/>;
}
}
}
экспортировать AccountRequired по умолчанию;
Кажется, что наблюдаемые объекты инициализируются как пустой объект каждый раз, когда я загружаю компонент, который использует хранилище.
Что мне не хватает?
Обновлять:
Здесь я включаю провайдера. index.tsx:
// Stores
import { stores } from './Stores';
ReactDOM.render(<Provider {...stores }><App /></Provider>, document.getElementById('root'));
Здесь все магазины экспортные. Магазины/индекс:
import { AccountStore } from "./AccountStore";
import { UserStore } from "./UserStore";
import { RolesStore } from "./RoleStore";
interface Stores {
[key: string]: any;
}
export const stores:Stores = {
accountStore: new AccountStore(),
userStore: new UserStore(),
rolesStore: new RolesStore()
}
Да, я обновил оп. UserStore внедряется в нескольких местах.
Из Мобкс документы:
MobX observable objects do not detect or react to property assignments that weren't declared observable before. So MobX observable objects act as records with predefined keys.
Вы можете попробовать один из следующих способов:
v5
observable
selectedAccount
от selectedAccount.set(ключ, значение)Оказывается, я не использовал Link
для перенаправления, я использовал теги привязки.
Таким образом, замена тегов привязки на react-router
Link
решила проблему.
Для всех, кто сталкивается с такой же проблемой, mobx-persist
— это библиотека, которая может сохранять наблюдаемое значение при обновлении страницы.
Не могли бы вы включить в вопрос свой компонент, который отображает
Provider
, и код, инициализирующийuserStore
?