Избегать гнездовой котельной на Эльмише?
Предположим, у меня есть вложенные компоненты Elmish: A
содержит B
содержит C
,
Тогда если C
имеет состояние и сообщения, они должны быть переданы из C
в B
а затем A
,
Например, тип сообщения и модель для B
возможно:
type Message =
| CMessage of C.Message
| UpdateFoo of string
type Model =
{
Foo : string
C : C.Model
}
затем update
за B
сделаем некоторую маршрутизацию:
let update message model =
match message with
| CMessage m ->
{
model with
C = C.update m model.C
}
| UpdateFoo foo -> { model with Foo = foo }
Тогда то же самое должно быть сделано для A
потребляющий B
Сообщения.
Это довольно многословно по сравнению с setState
, например.
Каковы некоторые стратегии для управления этим на Elmish?
0 ответов
Если вы создаете иерархию типов моделей, вам необходимо маршрутизировать сообщения через эту иерархию в update
. Если вы не хотите маршрутизировать сообщения через эту иерархию вupdate
, то не создавайте иерархию типов моделей. Это будет означать, что у вас есть плоская модель.
Однако я считаю, что плоская модель не является устойчивой. По мере того, как ваше приложение становится сложнее, вам нужно будет управлять этой сложностью, группируя связанные концепции в (под) модули, которые содержат свои собственные типы моделей.
Это довольно многословно по сравнению с
setState
, например. Какие есть стратегии для управления этим в Elmish?
Функция setState
это означало для библиотеки авторов. Ваш вопрос касается конкретной модели и типов сообщений, поэтому у меня сложилось впечатление, что вы являетесь "конечным пользователем" Elmish (а не автором библиотеки). Поэтому я считаю несправедливым сравнивать ваш примерupdate
функцию альтернативы, которая использует setState
так как вы должны использовать setState
.
Я думаю, что описанная вами многословность - это компромисс для жесткого контроля над мутацией. Используя Elmish, вы говорите, что хотите жестко контролировать мутации (позволяя почти всему этому происходить в Elmish вместо вашего кода), поэтому я думаю, что такая многословность необходима.