Elm 右边有两个值的函数意味着什么?(型号->;Html消息)
我在指南中遇到过:Elm 右边有两个值的函数意味着什么?(型号->;Html消息),elm,Elm,我在指南中遇到过: viewValidation : Model -> Html msg viewValidation model = let (color, message) = if model.password == model.passwordAgain then ("green", "OK") else ("red", "Passwords do not match!") in div [ style
viewValidation : Model -> Html msg
viewValidation model =
let
(color, message) =
if model.password == model.passwordAgain then
("green", "OK")
else
("red", "Passwords do not match!")
in
div [ style [("color", color)] ] [ text message ]
这是一个函数,它采用模型
。
Html-msg
在我看来,通常我们调用的是带有参数msg
的函数Html
msg
似乎在viewValidation
函数的任何其他部分中都不起任何作用。那么它是什么意思?在这种情况下它是干什么的?Html Msg
只是一个类型参数,就像List Int
一样。虽然List Int
表示包含Int
类型元素的列表,但类似地Html Msg
描述了一些可以处理/发出Msg
类型消息的Html
例如,如果HTML中有一个按钮,它可能如下所示:
button [ onClick DoSomething ] [ text "caption" ]
其中
DoSomething
是Msg
类型的一种情况。不要将类型定义与代码的正常执行混为一谈Html
不是一个函数,它是一种使用参数定义视图函数类型的类型
Html-msg
是最通用的定义,因为msg
本身是一个变量,因此返回的Html与当前使用的msg类型无关。这可能是因为它不创建事件消息,也可能是因为view函数将消息作为参数
正如所建立的注释一样,Html()
将是一种非常狭窄的类型,它被限制为不返回任何内容
不过,最常见的情况是返回Html Msg
的视图函数,即返回基于用户交互的消息的Html
由于Elm鼓励组件化,您还需要记住Html.map
。它的类型签名是Html.map:(a->b)->HTMLA->HTMLB
。在组件上下文中,这更容易理解为
Html.map : (Child.Msg -> Parent.Msg) -> Html Child.Msg -> Html Parent.Msg
请注意,当您在父组件中定义消息时,您将有如下内容:
type Msg = ChildMsg Child.Msg
这意味着ChildMsg
具有类型签名:
ChildMsg : Child.Msg -> Parent.Msg
所以我的视图函数有很多
parentView model =
-- childView model.child |> Html.map ChildMsg
Html.map ChildMsg (childView model.child)
不过,如果我没有弄错的话,
viewValidation
不会触发任何msg
,对吗?是的,你是对的。由于List
需要使用参数定义(您可以使用List a
),即使该参数为空,Html
也需要使用参数定义,即使未使用该参数。如果需要,可以使用htmla
如果它不返回任何内容,也可以使用Html()。请参阅:您不想使用()。相反,将其保留为类型变量msg,以后可以将其实例化为所需的任何类型。除非您需要保证不会发送任何消息,…Html msg
具有误导性和迷惑性!如果有,请使用HTMLA
。