Избегать гнездовой котельной на Эльмише?

Предположим, у меня есть вложенные компоненты 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 вместо вашего кода), поэтому я думаю, что такая многословность необходима.

Другие вопросы по тегам