elm - 在模块之间发送消息
问题描述
在使用可重用组件时,不太清楚如何在模块之间发送消息。
我有一个扩展的文本区域,我想在网站上的多个不同部分使用它。文本区域接受构成用户操作的部分 HTML。通常处理提交、取消、上传图标等。
试图写一个我正在谈论的快速示例,而不在这里抛出大量代码。所以本质上,我只想插入和播放已经附加的 HTML 片段。
我假设 CancelNote 作为 TextArea 消息被触发,所以它永远不会看到 Cancel Note 消息。不知道我将如何在这里使用 Html.map(或者即使我会)......感觉即插即用方法可能是一种不好的方法,但不确定我还能如何实现体面的可重用性。
SEPERATE MODULE
update model msg =
case msg of
CancelText ->
( { model | note = (Just "") }
, Cmd.none
)
view: stuff
view stuff =
......
TextArea.view
(button [ Html.Events.onClick CancelText] [])
TEXT AREA MODULE
view : Html.Html msg -> Html msg
view actionHtml =
div [ class "extended_text_area_container" ] [
textarea [] [
]
, actionHtml
]
解决方案
消息就像任何其他值一样只是值。您可以直接传递它们:
-- SEPERATE MODULE
view: stuff
view stuff =
......
TextArea.view CancelText
-- TEXT AREA MODULE
view : msg -> Html msg
view msg =
div [ class "extended_text_area_container" ]
[ textarea [] []
, button [ onClick msg ] []
]
编辑:如果您还需要维护内部状态,只需使用另一条消息告诉父级更新状态:
-- Main module
type msg =
...
SetTextAreaState TextArea.state
update model msg =
case msg of
...
SetTextAreaState state ->
{ model | textAreaState = state }
view : Model -> Html msg
TextArea.view SetTextAreaState model.textAreaState
-- TextArea module
type State =
...
type Msg =
Clicked
update : State -> Msg -> State
update state msg =
case msg of
Clicked ->
{ state | clicked = True }
view : (State -> msg) -> State -> Html msg
view toMsg state =
let
updateAndWrap msg =
toMsg (update state msg)
in
div [ class "extended_text_area_container" ]
[ textarea [] []
, button [ onClick (updateAndWrap Clicked) ] []
]
在这里,不是直接将 a 传递msg
给onClick
in ,而是TextArea.view
调用一个更新状态的函数,然后将其包装msg
在从父级传入的构造函数中,这将产生一个我们不知道的类型的消息。
此外,虽然我使用类似于整体 Elm 架构的内部Msg
类型和update
功能,但这绝不是强制性的。这只是一种很好的方法,因为它很熟悉并且可以很好地扩展。
推荐阅读
- java - 需要帮助将相同的日志消息写入具有不同日志记录级别的多个目标
- mysql - 未处理的异常:SocketException:操作系统错误:连接被拒绝,errno = 111,地址 = localhost,端口 = 35760 颤动
- python - 列表之间的随机替换项目
- linux-kernel - Linux内核IRQ执行长动作
- c# - 如何在 C# 脚本中解析和查找字符串?
- grapesjs - TypeError:无法读取 Grapesjs 中未定义的属性(读取“附加”)
- python - 从python中的布尔切片获取列表列表
- java - 在 Java 中使用多维 ArrayList 反转 ArrayList 的子集
- flutter - 如何在颤动的变量列表中添加数据多文本表单字段
- ios - 在 Iphone 8 plus (Xcode) 上测试时通知没有声音并且不振动