Я думаю, что @dwaynecrooks охватил технические аспекты вопроса. Но я считаю, что ваша проблема подразумевает и дизайн.
Как вырастить код вяза?
Как отмечали другие: мышление в терминах компонентов почти наверняка приведет вас к не очень привлекательному пути с Elm. (Многие люди начинают там. Я и моя команда начинали там более 2 лет назад, и нам потребовалось 3 приложения / основные редизайны, чтобы достичь точки, где, я думаю, мы можем быть довольны хотя бы основами.)
Вместо компонентов я предлагаю вам подумать о приложении Elm как о дереве. Каждый узел вашего дерева представляет уровень абстракции и описывает поведение вашего приложения на этом уровне. Когда вы чувствуете, что для данного уровня слишком много деталей, вы можете начать думать о том, как новые, более низкие уровни абстракции могут быть представлены как дочерние узлы.
На практике каждый узел реализован в своем собственном модуле Elm: родители импортируют своих детей. Вы также можете подумать, что вам не нужно придерживаться обычных model/update/view
подписей, скорее вам следует сосредоточиться на особенностях домена вашего приложения. Это то, что - в моем прочтении - Ричард Фельдман делает в своем приложении Real World SPA . И Жизнь Эвана из файлового разговора тоже связана с этим вопросом.
Дело navbar
+ body
Что касается вашего конкретного случая - это не редкий случай - вот мой опыт. Если мы говорим, что в нашем веб-приложении есть навигационная панель, а затем какое-то тело, это довольно статичное описание приложения. Этот вид описания может соответствовать мышлению, основанному на компонентах, но он менее полезен, если вы хотите получить элегантное приложение Elm.
Вместо этого стоит попытаться описать поведение вашего приложения на этом уровне абстракции, которое может звучать примерно так: Пользователь может выбрать x
, y
, z
предметов в навигационной панели. Нажатие на эти предметы повлияет на предмет q
, а также на тело - a
или b
. Он также может щелкнуть v
на панели навигации, чтобы отобразить всплывающее окно, или выполнить команду w
, которая выводит его из приложения.
Если вы берете это описание и применяете логику, которую я описал выше, вы, вероятно, должны в конечном итоге создать какую-то схему, в которой большая часть вашей панели навигации описана в вашем самом высоком уровне абстракции. Это включает в себя предметы x
, y
, z
, v
и поведение a
, b
, w
. Теперь поведение a
может означать, что должна отображаться конкретная обогащенная страница, которая имеет свое собственное подробное поведение, описанное на более низком уровне абстракции, тогда как поведение b
может означать, что в зависимости от выбора некоторый контент должен быть загружен, и снова детали этого процесса загрузки прорабатываются на более низком уровне абстракции. И так далее.
Когда мы начали подходить к проблеме таким образом, стало гораздо проще выяснить, как разделить логику и как справляться с особыми случаями.
Мы поняли, например, что когда кто-то сказал, что страница хочет отображать некоторые вещи «в панели навигации», она действительно имела в виду, что панель навигации должна сворачиваться (или преобразовываться) для конкретной страницы, чтобы страница могла отображать свой собственный заголовок. в этой области.
В этом нам помогло сосредоточиться на поведении приложения, а не на областях статического содержимого.