2016-01-28 5 views
0

У меня есть четыре компонента: Panel, PanelHeader, PanelBody, PanelFooter они состоят в следующем:Есть ли способ, доля государства между

<Panel> 
    <PanelHeader> 
     some title 
    </PanelHeader> 
    <PanelBody> 
     <div> 
      main content 
     </div> 
    </PanelBody> 
    <PanelFooter> 
     footer content 
    </PanelFooter> 
</Panel> 

У меня также есть несколько маршрутов, где я хочу видеть, что Panel, но с различным содержанием.

Очевидным решением является создание компонентов для каждого из маршрутов, и каждый из этих компонентов будет иметь свои собственные Panel.

Но в моем случае я хочу добавить некоторую морфинговую анимацию между маршрутами (изменить высоту панели, тело слайда, нижний колонтитул и т. Д.). Для этого мне нужно отобразить все содержимое точно таким же образом: Panel, PanelHeader, PanelBody, PanelFooter экземпляров, поэтому решение выше не будет работать.

Так что мне нужно разделить компонент маршрута на три компонента для каждого PanelXXX, и проблема в том, что эти компоненты должны реагировать друг на друга событиями.

Есть следующие моменты до сих пор:

  • Я не могу создать еще один компонент, один посредник контролировать эти три частичных компонентов, потому что не сможет получить доступ к своему API, пока она не будет оказана (поэтому я не могу реализовать методы getter, например getHeader()).
  • Я могу соединить их все с редуксом, но это слишком сложно.
  • Еще одно решение - создать объект, не являющийся объектом React, для совместного использования состояния, но в этом случае мне нужно будет очистить этот объект, чтобы преодолеть утечки памяти. Связь с redux также будет сложной. Этот подход выглядит не очень чистым для меня.
  • Я также могу обмануть прозрачный фон, чтобы у меня был один Panel, но несколько PanelHeader и т. Д. Но в этом случае мне нужно будет распространить знания об анимации на все дочерние компоненты.

Кто-нибудь знает какой-либо другой подход, чтобы сделать это в Реагировании? Или я должен выбрать один из пунктов выше?

ответ

0

Я думаю, что сценарий, который вы описываете, и вопросы, которые вы задаете, являются точными рационализациями для использования Flux. Redux - один из вариантов. Мы использовали обычную реализацию Flux Vanilla, используя оригинальную библиотеку Facebook, и у нас был большой успех.У этого есть крутая кривая обучения, но как только вы обнимаете его, такие проблемы, как тот, с которым вы столкнулись, просто вписываются в инфраструктуру.

+0

ОК. Я буду отмечать ваш ответ как правильный, потому что единственный вариант, который я вижу здесь, - связать все частичные компоненты через глобальное общее состояние. Но я ожидал, что кто-то предложит способ решить проблему, используя некоторое промежуточное, локальное состояние. – SleepWalker

+0

@SleepWalker Я полностью понимаю, но то, что вы предлагаете, является анти-шаблоном и использует Flux, как только вы его узнаете, упрощает управление этими проблемами. –

+0

nope. Магазин не должен знать о состоянии и связи с конкретным компонентом. Магазин предназначен для конкретной бизнес-логики. Обычно вы используете состояние компонента для хранения некоторого промежуточного состояния, пока не соберете все данные, необходимые для запуска действия. Это действие будет инициировано в некоторых обработчиках событий. Но в моем случае у меня есть кнопка (обработчик событий) в одном компоненте, а пользовательский интерфейс для сбора данных в другом компоненте и использование Хранилища в этом месте - плохой запах, но я пока не могу найти лучший способ решить эту проблему. – SleepWalker

0

Похоже, вы могли бы воспользоваться this.props.children.

маршрутизатор

<Router history={createBrowserHistory()}> 
    <Route path="/" component={App}> 
     <IndexRoute component={DefaultView} /> 
     <Route path="foopath" component={FooView} /> 
     <Route path="barpath" component={BarView} /> 
    </Route> 
</Router> 

App.js

... 

render: function() { 
    return (
     <Panel> 
      {this.props.children} 
     </Panel> 
    ); 
} 

... 

DefaultView.js

render: function() { 
    <div> 
     <PanelHeader> 
      FooHeader 
     </PanelHeader> 
     <PanelBody> 
      FooContent 
     </PanelBody> 
     <PanelFooter> 
      FooFooter 
     </PanelFooter> 
    </div> 
} 

Вы можете прочитать больше о Re act's детиhere.

+0

извините, но я имел в виду, что мне нужны синглтон 'PanelHeader',' PanelBody', 'PanelFooter' тоже. Я обновляю вопрос, чтобы быть более ясным. – SleepWalker

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