如何在不复制每条消息的整个结构的情况下传递状态?

时间:2017-11-19 17:29:09

标签: elm

我有一个文本框,在显示字符时速度极慢。

我曾经观察过与之相关的Stackoverflow异常。

我认为性能问题与准备门户值有关:

Sources.InputAccessId _ ->
    ( { model | portal = portal }, sourceCmd )

每次键入一个字符时,我都会复制并修改一个消耗更多内存的新门户记录。

代码可以在下面找到。

主要

onSourcesUpdated : Sources.Msg -> Model -> ( Model, Cmd Msg )
onSourcesUpdated subMsg model =
    let
        pendingPortal =
            model.portal

        provider =
            pendingPortal.provider

        profile =
            provider.profile

        source =
            pendingPortal.newSource

        ( sources, subCmd ) =
            Sources.update subMsg
                { profileId = profile.id
                , platforms = model.platforms
                , source = { source | profileId = profile.id }
                , sources = profile.sources
                }

        sourceCmd =
            Cmd.map SourcesUpdated subCmd

        pendingProvider =
            { provider | profile = { profile | sources = sources.sources } }

        portal =
            { pendingPortal | newSource = sources.source, provider = pendingProvider }
    in
        case subMsg of
            Sources.InputAccessId _ ->
                ( { model | portal = portal }, sourceCmd )
            ...

Sources.elm:

update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
    let
        source =
            model.source
    in
        case msg of
            InputAccessId v ->
                ( { model | source = { source | accessId = v } }, Cmd.none )
    ...

每次事件发生时,如何在不复制整个结构的情况下传递状态?

1 个答案:

答案 0 :(得分:0)

您可能希望使用这样的库去除这些事件:elm-debounce

然而,去抖动的结果是,某些事件将被丢弃,因此当用户完成键入/与页面交互时(更准确地说,在 - 可配置 - 超时之后),您只能得到一个总和它们。