Elm-在Elm中动态更新字段

Elm-在Elm中动态更新字段,elm,Elm,我复制了这段代码,所以任何人都可以试用 我将字段最小化为两个(title和slug),但还有其他类似的字段:content、extract 我是否可以在不为所有字段创建案例的情况下更新记录,比如只更新必要的字段而不检查所有字段?我会在您的代码中更改以下内容: 如果您对每个操作都有一条特定的消息,那么您可以使用更干净的update和view功能。编译器还将帮助您检查是否处理了所有情况,并且没有传递无意义的参数 type Msg = NoOp | NewPostTitle Post Stri

我复制了这段代码,所以任何人都可以试用

我将字段最小化为两个(title和slug),但还有其他类似的字段:content、extract


我是否可以在不为所有字段创建案例的情况下更新记录,比如只更新必要的字段而不检查所有字段?

我会在您的代码中更改以下内容:

如果您对每个操作都有一条特定的消息,那么您可以使用更干净的
update
view
功能。编译器还将帮助您检查是否处理了所有情况,并且没有传递无意义的参数

type Msg
  = NoOp
  | NewPostTitle Post String
  | NewPostSlug Post String
这不会为您节省太多输入,但您的
更新将如下所示。请注意,您不再有嵌套模式匹配。另外,请注意的语法,一次一个字段

update msg model =
  case msg of
    NoOp ->
      ( model, Cmd.none )
    NewPostTitle currentPost value ->
      ( { model | newPost = { currentPost | title = value } }, Cmd.none )
    NewPostSlug currentPost value ->
      ( { model | newPost = { currentPost | slug = value } }, Cmd.none )
最后,在您的视图中,您不必传递string参数,这使代码更加简洁。但真正重要的是,现在它是类型安全的

view model =
  div []
    [ h1 [] [ text ("title : " ++ model.newPost.title ++ " | slug : " ++ model.newPost.slug) ]
    , input [ onInput (NewPostTitle model.newPost), placeholder "Title" ] []
    , input [ onInput (NewPostSlug model.newPost), placeholder "Slug" ] []
    , button [] [ text "Save" ]
  ]

我会在您的代码中更改以下内容:

如果您对每个操作都有一条特定的消息,那么您可以使用更干净的
update
view
功能。编译器还将帮助您检查是否处理了所有情况,并且没有传递无意义的参数

type Msg
  = NoOp
  | NewPostTitle Post String
  | NewPostSlug Post String
这不会为您节省太多输入,但您的
更新将如下所示。请注意,您不再有嵌套模式匹配。另外,请注意的语法,一次一个字段

update msg model =
  case msg of
    NoOp ->
      ( model, Cmd.none )
    NewPostTitle currentPost value ->
      ( { model | newPost = { currentPost | title = value } }, Cmd.none )
    NewPostSlug currentPost value ->
      ( { model | newPost = { currentPost | slug = value } }, Cmd.none )
最后,在您的视图中,您不必传递string参数,这使代码更加简洁。但真正重要的是,现在它是类型安全的

view model =
  div []
    [ h1 [] [ text ("title : " ++ model.newPost.title ++ " | slug : " ++ model.newPost.slug) ]
    , input [ onInput (NewPostTitle model.newPost), placeholder "Title" ] []
    , input [ onInput (NewPostSlug model.newPost), placeholder "Slug" ] []
    , button [] [ text "Save" ]
  ]

是的,我一开始是这样做的,我在寻找更有效的方法,而不是对每个字段进行函数更新,(我有一些模型有超过12个字段)我喜欢这个答案,因为Elm记录是静态类型。如果我想有一些动态的东西,那么我会使用
Dict
或其他东西。谢谢大家,我认为这是Elm的方式,写得太多了,我会坚持下去。是的,我一开始是这样做的,我在寻找更有效的方式,而不是对每个字段都进行函数更新,(我有一些模型有超过12个字段)我喜欢这个答案,因为Elm记录是静态类型。如果我想有一些动态的东西,那么我会使用
Dict
或其他东西。谢谢大家,我认为这是Elm的方式,写得太多了,我会坚持下去