2015-09-11 4 views
3

Я создаю мобильное приложение SPA, используя React. Мне интересно, как я создаю контроллер навигации или контроллер панели вкладок, используя способ Flux. В основном мне интересно, как я обрабатываю права собственности на детей и кто/что обрабатывает фактические переходы.Как реализовать контроллер навигации/контроллер панели вкладок в React/Flux?

Прямо сейчас у меня есть компонент navigationController, который имеет метод push для добавления страниц в стек и перехода их в наш выход. Все это сохраняется в состоянии, и родительский компонент ничего не знает об этом.

Для моего контроллера панели вкладок родительский компонент проходит в некоторых элементах tabBar с дочерними элементами элемента tabBar, являющимся содержимым, отображаемым при активной вкладке. Контроллер панели вкладок обрабатывает, когда активна вкладка и какой контент отображается на активной вкладке. Родитель ничего не знает о том, какая вкладка активна. активная вкладка сохраняется в состоянии контроллера панели вкладок.

Подобные вещи, похоже, не легко реализуются в Flux. Как бы я, от родителя, сказать контроллеру навигации добавить элемент, а затем обработать переход изнутри контроллера. Кроме того, как добавить страницы к контроллеру, чтобы они могли продвигать новые страницы, если они должны пройти весь путь до корня?

Я думаю, моя проблема может заключаться в том, что я не совсем понимаю Flux.

Любая помощь была бы принята с благодарностью.

ответ

3

Похоже, что вы слишком много делаете в компонентах. Существует много способов реализовать архитектуру Flux, но часто проще всего продумать, что вы почти никогда не используете состояние, только реквизиты. Вся логика о том, какие вкладки доступны и что активно, войдет в TabStore вне компонентов React. Основной поток поток может выглядеть следующим образом:

  • TabStore сохраняет внутренний список вкладок и содержимого, а также отслеживает activeTab. Он предоставляет метод, например .getTabs(), чтобы разрешить виду доступ к текущему состоянию. Он также предоставляет методы EventEmitter, позволяющие публиковать изменения.

  • Корневой компонент в приложении устанавливает прослушиватель изменений в хранилище вкладок. Самый простой вариант это что-то вроде:

    _onChangeTabStore: function() { 
        this.setState({ 
         tabs: TabStore.getTabs(), 
         activeTab: TabStore.getActiveTab() 
        }); 
    }, 
    
  • корневой компонент затем передает tabs и activeTab к вашему TabBar компонента в качестве реквизита. Он может также передать обработчик как:

    onTabClick: function(clickedTab) { 
        TabActions.setActiveTab(clickedTab); 
    }, 
    
  • TabActions.setActiveTab собирается направить действие через AppDispatcher. См. the Flux docs для более подробной информации.

  • TabStore обрабатывает действие setActiveTab и обновляет его внутреннее состояние. Если активная вкладка изменилась, она выдает событие изменения.

  • Корневой компонент получает событие изменения, обновляет состояние и передает новые реквизиты на TabBar.

Нигде здесь никакой компонент React не отслеживает его собственное состояние - это задача магазина. Это обеспечивает действительно чистое разделение между бизнес-логикой и представлением. Он также избегает любого вопроса «как родитель знать, какая вкладка выбрана», потому что родитель получает также состояние табуляции.

+1

Как вы это делаете без единого элемента TabStore? Что делать, если я хочу больше одного tabBarController? Ответ вы определенно разъясняете Flux немного больше для меня, но я до сих пор не знаю, как эта модель будет работать для контроллера навигации, где дети (или страницы) контроллера определяют, какие страницы нажать/поп. - edit - Это может помочь отметить, что я не контролирую контент, который будет осуществлять навигационный контроллер. – Kyle

+0

В какой-то степени эта проблема выходит за пределы потока - то, что предлагает архитектура Flux, - это где-то проблема, то есть в отдельном логическом слое, а не в уровне представления. Например, у вас может быть однострочный TabStore, который управляет несколькими экземплярами под капотом, но он все равно будет следовать одному и тому же потоку. – nrabinowitz

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