У меня есть четыре компонента: 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
и т. Д. Но в этом случае мне нужно будет распространить знания об анимации на все дочерние компоненты.
Кто-нибудь знает какой-либо другой подход, чтобы сделать это в Реагировании? Или я должен выбрать один из пунктов выше?
ОК. Я буду отмечать ваш ответ как правильный, потому что единственный вариант, который я вижу здесь, - связать все частичные компоненты через глобальное общее состояние. Но я ожидал, что кто-то предложит способ решить проблему, используя некоторое промежуточное, локальное состояние. – SleepWalker
@SleepWalker Я полностью понимаю, но то, что вы предлагаете, является анти-шаблоном и использует Flux, как только вы его узнаете, упрощает управление этими проблемами. –
nope. Магазин не должен знать о состоянии и связи с конкретным компонентом. Магазин предназначен для конкретной бизнес-логики. Обычно вы используете состояние компонента для хранения некоторого промежуточного состояния, пока не соберете все данные, необходимые для запуска действия. Это действие будет инициировано в некоторых обработчиках событий. Но в моем случае у меня есть кнопка (обработчик событий) в одном компоненте, а пользовательский интерфейс для сбора данных в другом компоненте и использование Хранилища в этом месте - плохой запах, но я пока не могу найти лучший способ решить эту проблему. – SleepWalker