榆树状态转换消息
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
函数,子级可以使用该函数自行包装其消息,从而能够使用其父级也可以直接留言。
我一直在为如何在 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
函数,子级可以使用该函数自行包装其消息,从而能够使用其父级也可以直接留言。