将视图函数注释为返回Html msg
意味着您没有将视图绑定到特定的Msg
类型。因此它更加灵活,但也限制了您可以做的事情。
在编写不呈现特定于特定的任何代码的共享代码时,使用小写版本很有用Msg
。例如,您可以标准化一些布局代码:
pageTitle : String -> Html msg
pageTitle title =
h1 [ class "page-title" ] [ text title ]
上面的代码could return Html Msg
但这会限制它共享它的能力,因为你会将它绑定到特定的Msg
type.
现在,如果您正在编写能够生成特定事件的内容并将其绑定到Msg
构造函数,然后你必须返回Html Msg
:
type Msg = RollDice | Rolled Int
diceButton : String -> Html Msg
diceButton label =
button [ class "fancy-btn", onClick RollDice ] [ text label ]
如果您尝试返回小写,则上述定义将无法编译Html msg
.
如果我们停在那里,我可以看到这可能会与 React 中的智能组件与愚蠢组件的想法类似,因为小写版本似乎无法渲染会触发事件的 Html,但这种类比并不真正成立。假设您想要在系统范围内标准化按钮,但不想将其绑定到特定的按钮Msg
。您可以通过接受以下参数使该函数更加通用Msg
点击时触发。
fancyButton : String -> msg -> Html msg
fancyButton label msg =
button [ class "fancy-btn", onClick msg ] [ text label ]
一般来说,如果您正在编写要在内部共享或作为外部包共享的代码,则可以通过使用小写版本来提供更大的灵活性Html msg
。这样做,您仍然可以编写可以触发事件的 Html,就像fancyButton
上面的例子,它只是意味着你将一些责任传递给调用函数,调用函数必须决定什么Msg
进入。