2016-04-29 2 views
8

Я пытаюсь выяснить, как структурировать мое приложение, например, у меня есть модель User, универсальный UserStore, чтобы отслеживать загрузку всех пользователей до сих пор и некоторые связанные с UI магазины, такие как FriendList, PendingFriendList, BlockedUserList, LikedUserList и т.д. так:Как структурировать mobx

class User { 
    id; 
    @observable name; 
    @observable avatar; 
    // others functions and fields 
} 

class UserStore { 
    @observable users = []; 
    function resolve(id) { /*return by id*/} 
    function createOrUpdateUser(json) { /* add user to this.users */ } 
} 

class FriendStore { 
    @observable users = []; 
    hasNextPage = true; 
    currentPage = null; 

    function loadNextPage(page) { 
    api.loadFriends(page >= 0 ? page : this.currentPage + 1).then(users => { 
     users.forEach(user => { 
     this.users.push(UserStore.createOrUpdateUser(user)) 
     }) 
    }) 
    } 
} 

class PendingFriendUsers { 
    @observable users = []; 
    @observable query = null; 
    hasNextPage = true; 
    currentPage = null; 

    function loadNextPage(page) { 
    // more or less like FriendStore 
    } 
} 

class BlockedUserStore { 
    // more or less like FriendStore 
} 

Мой вопрос: является ли, что путь? Или есть лучший способ?

+0

Отказ от ответственности: Я автор хранилища https://github.com/rwieruch/react-mobx -soundcloud, но, возможно, минимальная структура папок шаблонов для приложения реального мира дает вам больше информации о том, как приложение может быть структурировано. –

+0

Более крупное приложение MobX для реального мира: https: // github.com/rwieruch/favesound-mobx –

ответ

8

Как вы, наверное, уже заметили, MobX не предписывает, как структурировать магазины, поэтому существует много возможных подходов.

Но лично я настроил бы это примерно так (это похоже на предлагаемую настройку магазина в docs). Это, может быть, немного старомодно, но легко следить за imho, это масштабируемая модель с четким разделением проблем. Альтернативные подходы могут быть найдены в этой example repo или в смежных проектах, как mobx-reactor

Небольшой совет: в вашем апи обратного вызова использовать transaction так, что все изменения будут применены сразу перед любыми наблюдателями уведомления.

8

Я работал над некоторыми проектами с Mobx &, поэтому я нашел эту структуру наиболее подходящей для меня.

Магазины

  • Магазины Доменные
    • хранит данные which'll необходимы в вашем приложении.
      для ex. пользовательские данные
  • Просмотреть Магазины
    • хранит данные which'll необходимо представить приложение
      напр. погрузочные, переменные ошибки

Модели

  • Здесь вы можете определить модели данных
    для модели экс- пользователя

Услуги

  • Здесь вы можете делать услуги, звонки api

Компоненты

  • Контейнер или смарт-компонент
  • Тупой или презентационный компонент
+1

?? В чем разница между UserStore и UserModel в вашей структуре? – AlxVallejo

+0

UserModel - это простой класс, который имеет свои собственные свойства и некоторые функции. для, например, –

+0

wut. Я думаю, что некоторые примеры пройдут здесь долгий путь. С тех пор я переключился на Redux из-за определенных двусмысленностей с Mobx, которые кажутся мне необоснованными. В Redux вы можете установить «модель» по умолчанию для магазина, который вы используете, и сохранить их в одном файле. Если вы определяете модель как состояние по умолчанию для этой модели, я бы поставил ее в хранилище как состояние по умолчанию. – AlxVallejo