Так что в последнее время я начал видеть, что все больше и больше людей используют MobX, и я хотел поделиться некоторыми идеями, которые я получил во время его использования в течение некоторого времени. Я собираюсь написать о нескольких темах, которые не так очевидны для новых пользователей MobX. Эта статья требует базовых знаний или предыдущего использования Mobx, я подготовил репозиторий Github, чтобы поиграть с этим материалом (здесь)
Кэширование вычисленных значений
Итак, у нас есть эта удивительная способность, называемая «вычисляемая» в MobX, которая позволяет извлекать значения из состояния, но если вы попытаетесь отладить ее, вы увидите, что некоторые значения кэшируются, а некоторые нет, так почему это происходит? Вычисленные функции кэшируются / запоминаются только тогда, когда они наблюдаются, например, наблюдаются автозапуском, реакцией или наблюдателем mobx-react. Это сделано так, чтобы избежать вычислений все время и только тогда, когда наблюдающее за ним mobx обнаруживает изменение.
Подробнее об этом здесь:
Переназначение наблюдаемых
MobX обертывает наблюдаемые своим собственным интерфейсом и методами, чтобы иметь возможность наблюдать за изменениями, поэтому, если вы переназначите ему значение, вы можете удалить оболочку MobX, а затем потерять все ее возможности, и это займет некоторое время, чтобы понять, почему это произошло.
Постарайтесь использовать как можно больше методов наблюдаемого, например, если это массив, просто используйте методы массива, такие как push, pop и т. Д.
На картинке выше показаны 2 наблюдаемых: одна слева была переназначена и потеряна, если способности, а вторая справа использовала push
метод массива и сохранила способности MobX.
Моделирование ваших данных
Я предлагаю попытаться моделировать ваши данные в максимально возможной степени, в то время как наблюдаемые Mobx автоматически делают большую часть вашего объекта наблюдаемым, он может пропускать несколько мест из-за своих правил создания наблюдаемый, а затем вы можете попасть в лабиринт, пытаясь понять, что пошло не так, вместо того, чтобы просто контролировать свои объекты и самостоятельно решать, что наблюдаемо, а что нет.
Вот пример, в котором вы управляете каждым из объектов / классов :)
Вы можете прочитать о правилах здесь:
Как структурировать свои магазины
Мой любимый способ, который мне очень хорошо помог во многих проектах, - это структурирование вашего магазина в виде дерева, начиная с корневого хранилища, которое содержит два хранилища, одно для данных, а другое для пользовательского интерфейса, а оттуда для построения дерева. Я также создал простую библиотеку, чтобы помочь с внедрением зависимостей и получением корня отовсюду в дереве, вы можете проверить это здесь: mobx-easy
В этом руководстве эта концепция рассматривается более подробно:
Подключение ваших магазинов к React
Мы собираемся создать React Context и обернуть наш <App />
компонент поставщиком, а затем передать ему корневое хранилище в качестве значения, мы также создадим имя функции createStore
, чтобы помочь нам создать корневое хранилище (в реальных проектах мы можем передать дополнительный функционал там).
Мы создадим пользовательский hook
для получения корневого хранилища через только что созданный контекст.
И тогда мы можем легко получить доступ к нашим магазинам в каждом компоненте реакции следующим образом:
useObserver / наблюдатель
Итак, в последней теме мы сосредоточимся на самом подключении, предыдущая тема была просто настройкой.
Если ваш проект состоит только из функциональных компонентов, вы можете использовать mobx-react-lite, если вы классифицируете компоненты, вам нужно будет использовать mobx-react.
Эти две библиотеки в основном помогают нам подключаться к реагирующим компонентам, предоставляя нам observer
/ useObserver
функции, под капотом они наблюдают за каждым наблюдаемым использованием mobx, как и autorun
.
Если вы оберните свой компонент observer
, все наблюдаемые, используемые внутри компонента, будут наблюдаться, и компонент будет повторно визуализироваться после любого изменения, если вы заключите возвращаемое значение с помощью useObserver
, будут отслеживаться только наблюдаемые внутри него, а если вы не используете любой из них, тогда ваш компонент вообще не будет перерисовывать. (вы можете найти пример кода здесь: ссылка)
Обзор MobX 6
Итак, на этой неделе команда MobX опубликовала первый релиз-кандидат для v6: https://www.npmjs.com/package/mobx/v/6.0.0-rc.1
Главное, что мы можем ожидать, увидев здесь, это постепенно перестать использовать декоратор, поскольку его предложение не продвинулось в tc39, нам нужно будет начать использовать новые функции, называемые makeObservable
и makeAutoObservable
, которые помогут нам решить, какие свойства в классе являются наблюдаемые / действия / вычисленные и которые не обходятся без декораторов.
О решении перейти от декораторов и многом другом вы можете прочитать в этом выпуске:
и есть более обновленная документация по mobx 6, которую вы можете проверить здесь:
Подвести итог
Я постарался сделать тему максимально короткой и прямой, я создал репозиторий со всеми примерами, чтобы вы могли поиграть с ними и лучше увидеть их в коде, чем в статье.
Я надеюсь, что эта статья поможет людям с MobX или, по крайней мере, заставит их задуматься или дать идеи о том, как улучшить проект, над которым они сейчас работают :)
Обновление от 20 сентября
Я выпустил обширный курс по MobX, вы можете ознакомиться с ним здесь: