榆树状态转换消息



我一直在努力如何在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/browserBrowser.Navigation.pushUrl以编程方式修改 URL,两者都返回Cmd msg

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

阅读有关导航和 URL 解析的指南页面是一个良好的开端。查看Elm SPA示例中的工作方式始终是一个好主意。

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

相关内容

  • 没有找到相关文章

最新更新