榆树状态转换消息

elm state transition Msg

我一直在为如何在 Elm 中组织我的代码而苦恼,经过一番谷歌搜索后我找到了 this。这不是最近的,但我已经尝试过了,与我以前拥有的相比,结果非常好。但是尝试将其应用到我的状态时,我发现自己想要创建空的 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,但它是视图函数 returns 和 ProjectList.Types.Msg 而不是常规Msg。我想出的一个想法是创建一个空的 Cmd,它将使用 TransitionProjectView 回调,这似乎不对。

另一个想法是使用像 ProjectList TransitionToProjectView 这样的 Msg 并在根更新函数中首先匹配它,但不确定是否长期如此。

我确实看到 Cmd.map 文档上的注释说如果你需要这个你可能做错了什么,不幸的是 link 解释该怎么做已经死了。 从一种状态过渡到另一种状态的正确方法是什么,或者如果整个事情都是错误的,更好的架构是什么?

这通常可以使用路由来完成。我还没有迁移到 0.19,这稍微改变了导航的细节,但我认为 0.19 和 0.18 的基本思想是一样的。为您的路线生成一个 URL 并使用该 URL 渲染一个 link,或者使用来自 ´elm-lang/navigation 的 Navigation.modifyUrl 以编程方式修改 URL ´ 在 0.18 中或 Browser.Navigation.pushUrl 来自 elm/browser 在 0.19 中,两者都是 return 和 Cmd msg.

您很可能还需要某种基于自定义类型的框架,以获得类型安全的路由,而不是直接处理原始字符串 URLs。

阅读 Navigation and URL Parsing is a good start. And looking at how things are done in Elm SPA example 上的指南页面总是一个好主意。

如果出于某种原因您不想使用路由,在根更新函数中匹配 ProjectList TransitionToProjectView 似乎是一个不错的方法。或者,不是使用 Html.map 将 msg 包装在父级中,您可以让父级向子级传递一个 Child.Model -> Msg 函数,子级可以使用该函数自行包装其消息,从而能够使用其父级也可以直接留言。