Architecture elm状态转换
我一直在努力研究如何用Elm组织我的代码,经过一些谷歌搜索后,我发现。这不是最近的,但我已经尝试过了,结果非常好,与我以前的相比。但试图将其应用于我的状态时,我发现自己想要创建空的Architecture elm状态转换,architecture,navigation,elm,elm-architecture,Architecture,Navigation,Elm,Elm Architecture,我一直在努力研究如何用Elm组织我的代码,经过一些谷歌搜索后,我发现。这不是最近的,但我已经尝试过了,结果非常好,与我以前的相比。但试图将其应用于我的状态时,我发现自己想要创建空的Cmd,只是为了向“root”更新函数发送Msg,以便从一个状态转换到另一个。 这似乎不对,我想我只是做错了 假设我有这个: type alias Model = { state : State } type State = StateProjectList ProjectList.Types.Model
Cmd
,只是为了向“root”更新函数发送Msg
,以便从一个状态转换到另一个。
这似乎不对,我想我只是做错了
假设我有这个:
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
,但它的view函数返回的是ProjectList.Types.Msg
,而不是常规的Msg
。我想到的一个想法是创建一个空的Cmd
,它将使用TransitionProjectView
调用,这似乎不正确
另一个想法是使用类似Msg的ProjectList transitiononprojectview
,并在root update函数中匹配第一个,但不确定是否会长期使用
我确实在Cmd.map
的文档上看到了一条注释,上面说如果你需要这个,你可能做错了什么,不幸的是,解释该做什么的链接已经失效了。
从一种状态过渡到另一种状态的正确方法是什么?如果整个过程都是错误的,那么更好的体系结构是什么?这通常是通过路由实现的。我还没有迁移到0.19,这稍微改变了导航的细节,但我认为基本思想在0.19和0.18中是一样的。为您的路线生成URL并使用该URL呈现链接,或者使用0.18中的“elm lang/Navigation”中的Navigation.modifyUrl
或0.19中的Browser.Navigation.pushUrl
fromelm/Browser
以编程方式修改URL,两者都返回Cmd msg
您很可能还需要基于自定义类型的某种框架,以获得类型安全路由,而不是直接处理原始字符串URL
阅读和上的指南页是一个良好的开端。看看这些事情是如何完成的总是一个好主意
如果出于某种原因您不想使用路由,那么在根更新函数中匹配ProjectList transitiononprojectview
似乎是一种不错的方法。或者,不必使用Html.map
在父级中包装消息,您可以让父级向子级传递一个child.Model->msg
函数,子级可以使用该函数包装其消息本身,从而也可以直接使用其父级消息 我不知道导航的存在,这很好。使用Nav.load虽然有效,但使用起来有点烦人,所以我将其与您的建议结合起来,即只从所有视图返回一个根消息,效果非常好。我以为循环依赖会阻止我这么做。。我想不是。谢谢,现在它不仅工作得很好,而且我还有适当的url和历史支持作为奖励,非常高兴!