我已经完成了Elm指南,并注意到非常简单的例子,update
函数增长到3个案例,Msg
类型可以有3个构造函数.我想在一个中间项目,这将增长到20,在一个高级项目,它可能是数百.你是如何管理的?我预见如果每个开发人员都需要为其功能添加新的构造函数,那么这就是版本控制争用的来源.
我参与了react-redux项目,它有一个结合Reducer来解决这个问题的概念.我没有在Elm遇到过这个概念.它有吗?
您可以定义msg类型由子/子msg类型组成,当然,updater可以与子函数组合.即.
-- Counter
type CounterMsg
= Increment
| Decrement
type alias CounterModel =
Int
updateCounter : CounterMsg -> CounterModel -> ( CounterModel, Cmd msg )
updateCounter msg model =
case msg of
Increment ->
( model + 1, Cmd.none )
Decrement ->
( model - 1, Cmd.none )
-- Todo
type TodoMsg
= AddTodo String
type alias TodoModel =
List String
updateTodo : TodoMsg -> TodoModel -> ( TodoModel, Cmd msg )
updateTodo msg model =
case msg of
AddTodo str ->
( str :: model, Cmd.none )
-- unified
type alias Model =
{ counter : CounterModel
, todos : TodoModel
}
type Msg
= Counter CounterMsg
| Todo TodoMsg
initModel =
{ counter = 0, todos = [] }
update : Msg -> Model -> ( Model, Cmd msg )
update msg model =
case Debug.log "message" msg of
Counter countermsg ->
let
( newmodel, cmd ) =
updateCounter countermsg model.counter
in
( { model | counter = newmodel }, cmd )
-- etc...
_ ->
( model, Cmd.none )
Run Code Online (Sandbox Code Playgroud)