我一直在努力如何在Elm中组织我的代码,经过一些谷歌搜索,我发现了这个。这不是最近的事情,但我已经尝试过了,与我以前相比,结果非常好。但是试图将其应用于我的状态,我发现自己想要创建空Cmd
只是为了向"根"更新函数发送Msg
,从一个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
回调,这似乎不对。
另一个想法是使用类似ProjectList TransitionToProjectView
的消息并在根更新函数中首先匹配它,但不确定是否长期。
我确实看到了Cmd.map
文档上的注释,说如果您需要这个,您可能做错了什么,不幸的是,解释该怎么做的链接已经死了。 如果整个事情是错误的,那么从一种状态过渡到另一种状态的正确方法是什么,或者更好的架构是什么?
这通常使用路由来完成。我还没有迁移到 0.19,这稍微改变了导航的细节,但我认为 0.19 的基本思想与 0.18 中相同。要么为您的路由生成一个 URL 并使用该 URL 呈现链接,要么使用 0.18 中"elm-lang/navigation"中的Navigation.modifyUrl
或 0.19 中来自elm/browser
的Browser.Navigation.pushUrl
以编程方式修改 URL,两者都返回Cmd msg
。
您很可能还需要基于自定义类型的某种框架,以便获得类型安全路由,而不是直接处理原始字符串 URL。
阅读有关导航和 URL 解析的指南页面是一个良好的开端。查看Elm SPA示例中的工作方式始终是一个好主意。
如果出于某种原因您不想使用路由,则在根更新函数中匹配ProjectList TransitionToProjectView
似乎是一种不错的方法。或者,您可以让父级传递一个Child.Model -> Msg
函数,而不是使用Html.map
将 msg 包装在父级中,子级可以使用该函数来包装其消息本身,从而也可以直接使用其父级消息。