Наблюдаемые объекты React MobX продолжают сбрасываться

Я столкнулся с проблемой, когда мои наблюдаемые в хранилище 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()
}

Не могли бы вы включить в вопрос свой компонент, который отображает Provider, и код, инициализирующий userStore?

Tholle 09.04.2019 12:09

Да, я обновил оп. UserStore внедряется в нескольких местах.

TietjeDK 09.04.2019 12:35
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
2
1 641
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Из Мобкс документы:

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.

Вы можете попробовать один из следующих способов:

Ответ принят как подходящий

Оказывается, я не использовал Link для перенаправления, я использовал теги привязки.

Таким образом, замена тегов привязки на react-routerLink решила проблему.

Для всех, кто сталкивается с такой же проблемой, mobx-persist — это библиотека, которая может сохранять наблюдаемое значение при обновлении страницы.

Другие вопросы по теме

Похожие вопросы