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

Elm 如何在不复制每条消息的整个结构的情况下传递状态?,elm,Elm,我有一个文本框,它在显示字符时非常慢 我曾经观察到一个与之相关的Stackoverflow异常 我认为性能问题与准备门户价值有关: 每次键入一个字符时,我都会复制和修改一个新的门户记录,这会消耗更多内存 代码可以在下面找到 Main: onSourcesUpdated : Sources.Msg -> Model -> ( Model, Cmd Msg ) onSourcesUpdated subMsg model = let pendingPortal =

我有一个文本框,它在显示字符时非常慢

我曾经观察到一个与之相关的Stackoverflow异常

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

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

代码可以在下面找到

Main:

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 )
            ...
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 )
    ...
来源。elm:

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 )
            ...
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 )
    ...

如何在每次事件发生时传递状态而不复制整个结构?

您可能希望使用如下库来消除这些事件的影响:


不过,取消Bouncing的结果是,一些事件将被丢弃,因此当用户完成键入/与页面交互时(更准确地说,在–可配置–超时之后),您只会得到一个将所有事件相加的事件。

我认为问题与“复制整个结构”无关因为这不是Elm处理更新的现实解释。我认为问题在于,你只是想在每次按键时做得太多。您可能想考虑使用一个Debug包。谢谢乍得。我的应用程序非常慢。有没有专门介绍性能模式的书籍可以让我使用?我肯定有,但我想不出我个人读过或可以推荐的