在 Elm 中使用小部件列表进行组合时处理消息
Handling messages when composing with list of widgets in Elm
在少数guides中,父组件中的消息处理是这样的;
type Msg
= NavMsg Nav.Msg
| SidebarMsg Sidebar.Msg
| WidgetMsg Widget.Msg
父组件在更新中处理它们:
update : Msg -> AppModel -> (AppModel, Cmd 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)
_ ->
但是,如果子组件在列表中,我找不到一种简单的方法来执行相同的操作。我怎样才能告诉正确的子组件对发给他的消息做出反应?
我想到了将组件对象添加到消息中:
type Msg
= MessageToParent
| MessageToChild Child Child.Msg
但是如果 Child 组件很大,这似乎非常低效,并且在尝试将内部 Child.Msg
委托给右侧 Child
时仍然给我带来麻烦 Child
。
处理传递给组件列表的消息的最佳方式是什么?
我建议使用数组(或字典)和这样的代码
type Msg
= WidgetMsg Int Widget.Msg
update : Msg -> AppModel -> (AppModel, Cmd Msg)
update message model =
case message of
WidgetMsg idx subMsg ->
model.widgetModels
|> Array.get idx
|> Maybe.map (Widget.update subMsg)
|> Maybe.map (\(m,c) ->
({ model | widgetModels = Array.set idx m model.widgetModels }
, Cmd.map Widgetmsg idx c)
)
|> Maybe.withDefault (model, Cmd.none)
_ ->
在少数guides中,父组件中的消息处理是这样的;
type Msg
= NavMsg Nav.Msg
| SidebarMsg Sidebar.Msg
| WidgetMsg Widget.Msg
父组件在更新中处理它们:
update : Msg -> AppModel -> (AppModel, Cmd 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)
_ ->
但是,如果子组件在列表中,我找不到一种简单的方法来执行相同的操作。我怎样才能告诉正确的子组件对发给他的消息做出反应?
我想到了将组件对象添加到消息中:
type Msg
= MessageToParent
| MessageToChild Child Child.Msg
但是如果 Child 组件很大,这似乎非常低效,并且在尝试将内部 Child.Msg
委托给右侧 Child
时仍然给我带来麻烦 Child
。
处理传递给组件列表的消息的最佳方式是什么?
我建议使用数组(或字典)和这样的代码
type Msg
= WidgetMsg Int Widget.Msg
update : Msg -> AppModel -> (AppModel, Cmd Msg)
update message model =
case message of
WidgetMsg idx subMsg ->
model.widgetModels
|> Array.get idx
|> Maybe.map (Widget.update subMsg)
|> Maybe.map (\(m,c) ->
({ model | widgetModels = Array.set idx m model.widgetModels }
, Cmd.map Widgetmsg idx c)
)
|> Maybe.withDefault (model, Cmd.none)
_ ->