elm - 这个 `div` 调用产生: Html (String -> Msg) 但是 `view` 上的类型注释说它应该是: Html Msg
问题描述
我目前正在学习榆树,我只是偶然发现了这个问题,其中 div 返回一个 Html (String -> Msg) 而不是 Html Msg。
我收到的错误消息
此div
调用产生:
Html (String -> Msg)
但是上的类型注释view
说它应该是:
Html Msg
type alias Model =
{
firstNum: String,
secondNum: String,
answer: String
}
init: Model
init = { firstNum = "",
secondNum = "",
answer = ""}
type Msg =
Add String| Minus String
update: Msg -> Model -> Model
update msg model =
case msg of
Add x -> { model | answer = x}
Minus y -> { model | answer = y}
view : Model -> Html Msg
view model =
div []
[
input [ placeholder "Text to reverse", value model.firstNum] [],
button [onClick Add] [text "add"],
div [] [text model.answer]
]
main =
Browser.sandbox
{ init = init,
update = update,
view = view
}
解决方案
您将Msg
类型定义为
type Msg =
Add String| Minus String
有Add
一个String
论点,但是当你在这里使用它时:
button [onClick Add] [text "add"],
你根本没有给它任何论据。
根本问题似乎是您对 Elm 架构的心理模型是错误的。您似乎将消息视为“操作”或函数调用而不是事件,其中Add
一个函数将参数应用于模型。
相反,您应该将消息视为触发它的描述。而不是Add String
,您可以调用它AddButtonClicked
,不带参数(在这种情况下)。然后让更新函数只根据模型中的内容做它应该做的事情,我猜这是对firstNum
and的算术运算secondNum
。
但是您也没有填充这些字段。为此,您需要使用该onInput
事件,该事件确实要求一条带有String
. 例如,您可以添加一条新消息FirstNumChanged String
,然后像这样使用它input
:
input [ placeholder "Text to reverse", onInput FirstNumChanged, value model.firstNum] [],
我会留给你弄清楚如何处理它update
。
推荐阅读
- java - 如何在鼠标移动创建的矩形上使用工具提示 - Java
- python - 运行假设时如何退出 pdb 调试?
- c# - 当同时撰写多封电子邮件时,Outlook 不会触发 AttachmentAdd 事件,但一封电子邮件除外
- json - 如何在 json 文件中使用变量?
- react-native - React Native webview with login facebook总是在发布模式下重定向到另一个url(仅限android)
- amazon-web-services - 如何从 AWS VPC 中的私有子网连接到 Internet?
- python - 如何在数据框列 pandas 中找到最接近所选数字的 5 个数字的索引?
- facebook-graph-api - DailogFlow 将线程控制传递给 Facebook Messenger
- windows - Magento 2.3.0 file_get_contents() 问题:权限被拒绝
- python - 如何使用python将此HTML文件转换为PDF