Elm中能否创建执行完成后不发送消息的Cmd?
在Elm中执行Dom.focus不发送任何消息
当然可行!你当前用Task.attempt接收结果再忽略的方式虽然能工作,但确实有点冗余——我们完全可以创建一个执行完后不会产生任何消息的Cmd,根本不用在update里处理空操作分支。
核心思路是利用Elm的Never类型:这是一个不可能存在实例的类型,Elm运行时明确知道永远不会有这种类型的消息,所以会直接跳过消息发送的步骤。
具体实现
你可以封装一个工具函数,把Dom.focus转换成无消息的Cmd:
import Html.Dom as Dom import Task -- 静默执行元素聚焦,不会向update发送任何消息 focusSilently : String -> Cmd msg focusSilently elementId = Dom.focus elementId -- 丢弃Task的结果,将其转换为无返回值的Task () |> Task.ignore -- 把空结果映射为Never类型(永远不会触发的消息) |> Task.perform (\_ -> never)
为什么这能生效?
Task.ignore会把Dom.focus返回的Task x ()转换成Task (),直接丢弃原本的成功/失败结果。never是Elm内置函数,它接受任意参数但返回Never类型——这个类型没有任何可能的取值,Elm运行时会识别到这一点,因此执行完聚焦操作后不会向update传递任何消息。
使用示例
直接在需要触发聚焦的地方调用这个函数即可,比如:
-- 举个例子:在某个消息处理逻辑中触发静默聚焦 handleMsg : Msg -> Model -> (Model, Cmd Msg) handleMsg msg model = case msg of SomeTriggerEvent -> model ! [ focusSilently "element-id" ] -- 其他消息分支...
这样一来,你完全不用在update里添加任何处理聚焦结果的分支,Elm引擎会默默执行聚焦操作,之后什么额外动作都不会有。
内容的提问来源于stack exchange,提问作者Ralph
相关产品推荐
相关产品推荐

