2016-06-28 7 views
5

Я чувствую, что получаю большую часть mobx, но я хочу что-то прояснить. У меня есть магазин с некоторыми наблюдаемыми, ядром которого является массив объектов (машинопись):Когда использовать вычисляемые/наблюдаемые в mobx

class ClientStore { 
    constructor() { 
     this.loadClients(); 
    } 

    @observable private _clients: IClient[] = []; 
    @computed get clients() { 
     return this._clients; 
    } 
    @observable isFetching: boolean = false; 
    @observable sortField: 'title' | 'modified' = 'modified'; 
    @observable sortDescending: boolean = true; 

    getClientByUrlName(urlName: string): IClient { 
     return this._clients.find(c => c.urlName === urlName); 
    } 
etc... 

Мой вопрос заключается в том, что последней функции - getClientByUrlName. Поскольку это обнаружение из наблюдаемого, любой компонент реагирования @observer, который использует эту функцию, повторно отображает правильно. Является ли этот идиоматический моб для чего-то подобного? Похоже, это должно быть вычисленным значением. Должен ли я сделать вычисляемое значение в компоненте, который хочет его использовать?

//import singletone ClientStore 
class ClientDetailsView extends React.Component<{params:{urlName:string}}, void> { 

    @computed get client() { 
     return ClientSotre.clients.find(c => c.urlName === this.props.params.urlName); 
    } 

...rest of react component 

Я ищу лучшие практики и gotchas здесь. Любая помощь приветствуется.

* редактировать фиксированный код ошибки выборки

ответ

7

В принципе @computed просто директива, которая говорит MobX: «это значение не может быть кэшируются до любого из наблюдаемых, которые используются изменения». Таким образом, на самом деле их всегда можно оставить без внимания, это просто означает, что ваше приложение будет перепрограммировать больше, но это не изменит результаты.

Так что, если вам не хватает @computed о функции, которая в принципе не является проблемой в большинстве случаев. Если это так, вы можете использовать createTransformer, который принимает функцию с одним аргументом и создает кеш-память для самоочистки вычисленных значений. Но это немного более активно, так что на самом деле ваше решение ввести рассчитанное свойство в вашем ClientDetailsView лучше. Я бы рекомендовал сделать это, если у вас есть хорошее место для размещения этого вычислимого имущества (компонент, который в этом нуждается в этом случае)

+0

Ах, ха! Это было похоже на то, что мне не хватало. Каждый раз, когда я просматриваю документы, я вижу часть, как если бы она была совершенно новой. Забавно, что приклеивание вычисленного имущества в самом компоненте пришло ко мне, когда я писал вопрос. [off topic] Мне очень нравится MobX вообще (я перехожу из редукса). Чем больше я узнаю, как это работает, тем больше мне это нравится. Спасибо за всю тяжелую работу! – Jakke

+0

Я на самом деле немного реструктурировал документы в последние дни, так что это впечатление правильно :) – mweststrate

+0

Я немного смущен, почему было бы лучше поставить '@ computed' в ClientDetailsView, а не в хранилище. Положит ли он в магазин тот же эффект? – Jeff

Смежные вопросы