在elm git book中描述了一种体系结构,其中子组件生成通过主更新功能传播的消息,最终由子组件中的适当更新功能处理。翻译模式与此有何不同以及每种模式的用例是什么。请提供一个简单的例子。
答案 0 :(得分:1)
每当你有一个嵌套的"组件"使用update
函数,您需要确保父项通过子项Msgs和Cmds。 git book outlines this with a simple example(此代码位于父级,Widget
是子级):
type Msg
= WidgetMsg Widget.Msg
update message model =
case message of
WidgetMsg subMsg ->
let
( updatedWidgetModel, widgetCmd ) =
Widget.update subMsg model.widgetModel
in
( { model | widgetModel = updatedWidgetModel }, Cmd.map WidgetMsg widgetCmd )
以上是任何时间孩子具有update
功能的必要条件。但是,在上面的例子中,父母从不知道或不关心孩子的信息被传达给孩子。
但是现在,考虑父母需要知道孩子生成的消息的情况。例如:嵌套子组件需要与父母进行通信以使游戏丢失的游戏。
当父组件需要对子更新函数返回的消息作出反应时,Translator Pattern很有用。以下是链接示例中更新函数的基本结构:
GameMsg internalMsg ->
let
(game_, cmd)
= Game.update internalMsg model.game
in
{ model | game = game_ } ! [ Cmd.map gameTranslator cmd ]
请注意,它看起来很像早期的update
示例;主要区别在于,而不是将Cmd
直接映射到盲父Msg
(盲,因为第一个示例中的单个WidgetMsg
仅传递给child Msg
),gameTranslator
映射函数允许您映射到其中一条父消息。
完整阅读Translator Pattern Blog Post可能会有所帮助。它是为Elm 0.17编写的,因此有一些语法更改,但总体思路仍然存在。