Сообщение состояния вяза Msg

Я боролся с тем, как организовать свой код в Elm, и после некоторого поиска в Google я нашел это. Это не так уж недавно, но я попробовал это, и результат довольно хороший, по сравнению с тем, что я имел раньше. Но пытаясь применить это к моим штатам, я хочу создать пустой Cmd просто чтобы отправить Msg в функцию обновления "root", чтобы перейти от одного State к другому. Это не кажется правильным, я предполагаю, что я делаю это неправильно.

Итак, скажем, у меня есть это:

type alias Model =
  { state : State
  }

type State = StateProjectList ProjectList.Types.Model
           | StateProjectView ProjectView.Types.Model

type Msg = ProjectList ProjectList.Types.Msg
         | ProjectView ProjectView.Types.Msg
         | TransitionProjectView Project

Когда я в StateProjectListМне нужно иметь возможность перейти к StateProjectView как-то, но это функция представления возвращает ProjectList.Types.Msg и не обычный Msg, Одна идея, которую я придумал, - создать пустое Cmd что бы перезвонить с помощью TransitionProjectView, который не кажется правильным.

Другая идея состоит в том, чтобы использовать Msg как ProjectList TransitionToProjectView и сопоставьте это сначала в функции обновления корня, хотя не уверен насчет этого в долгосрочной перспективе.

Я видел записку о Cmd.mapДок говорит, что если вам это нужно, вы, вероятно, делаете что-то не так, к сожалению, ссылка, объясняющая, что делать вместо этого, мертва. Каков был бы правильный способ либо перейти из одного состояния в другое, либо улучшить архитектуру, если все это неправильно?

1 ответ

Решение

Обычно это достигается с помощью маршрутизации. Я еще не перешел на 0,19, что немного меняет детали навигации, но основная идея в 0,19 такая же, как и в 0,18, я думаю. Либо сгенерируйте URL для вашего маршрута и создайте ссылку с этим URL, либо измените URL программно с помощью Navigation.modifyUrl от "elm-lang/navigation" в 0.18 или Browser.Navigation.pushUrl от elm/browser в 0,19, которые оба возвращают Cmd msg,

Скорее всего, вам также понадобится какая-то структура вокруг этого, основанная на пользовательских типах, чтобы получить безопасную маршрутизацию типов вместо непосредственного обращения к необработанным строковым URL-адресам.

Чтение страниц руководства по навигации и парсингу URL - хорошее начало. И смотреть, как все делается в примере Elm SPA, всегда хорошая идея.

Если по какой-то причине вы не хотите использовать маршрутизацию, сопоставление на ProjectList TransitionToProjectView в корне функция обновления выглядит как достойный подход. В качестве альтернативы вместо переноса сообщения в родительском с помощью Html.mapВы могли бы, чтобы родитель передал ребенку Child.Model -> Msg функция, которую ребенок может использовать, чтобы обернуть свои сообщения самостоятельно, и, таким образом, иметь возможность напрямую использовать сообщение своих родителей.

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