Elm项目中如何正确为input元素添加onchange事件处理器?
Elm 中 input 元素 change 事件绑定方法
报错原因
Html.Events核心模块没有内置onChange事件处理函数,编译器找不到对应变量就会抛出你看到的命名错误,和事件绑定的内容写法无关。
正确实现方案
方案1:手动自定义onChange(无额外依赖,推荐)
Elm的事件绑定底层统一用on函数实现,你只需要指定原生事件名、写好事件值的解码器,就能封装出需要的事件处理器,全程不需要安装第三方包。
- 先导入必须的依赖模块:
import Html exposing (input) import Html.Events exposing (on, onClick, targetValue) import Json.Decode - 封装通用
onChange函数,逻辑是监听原生DOM的change事件,自动解码出输入框的最新值,传给你的消息构造逻辑:onChange : (String -> msg) -> Html.Attribute msg onChange msgBuilder = on "change" (Json.Decode.map msgBuilder targetValue) - 在视图中直接调用即可。注意
change事件和click事件不同,它会携带输入框的最新值,所以需要用函数接收这个值再生成你的消息记录,对应你的业务代码写法如下:
如果你不需要获取输入值,就想像input [ onChange (\inputValue -> { desc = "ChangeFunction", info = inputValue }) ] []onClick一样绑定固定消息,也可以封装一个传固定值的版本:onChangeFixed : msg -> Html.Attribute msg onChangeFixed msg = on "change" (Json.Decode.succeed msg) -- 调用方式和你之前的onClick完全一致 input [ onChangeFixed { desc = "ChangeFunction", info = model.name } ] []
方案2:直接使用内置onInput(适配实时输入场景)
很多开发者找onChange其实是要实现「用户输入时实时响应」的效果,这种场景不需要自定义事件,Html.Events已经内置了onInput函数,会在用户每次输入字符时触发,直接导入就能用:
import Html.Events exposing (onInput) -- 调用方式和自定义的onChange一致 input [ onInput (\inputValue -> { desc = "InputFunction", info = inputValue }) ] []
注意区分两个事件的触发时机:
onInput在输入内容变化时实时触发,onChange在输入框失焦、用户确认输入后才触发,根据业务需求选择即可。
内容的提问来源于stack exchange,提问作者iamaprogrammer
相关产品推荐
相关产品推荐

