Functional programming 如何嵌入模块';将UI插入应用程序的某个区域';贝壳是什么?

Functional programming 如何嵌入模块';将UI插入应用程序的某个区域';贝壳是什么?,functional-programming,elm,Functional Programming,Elm,如何将模块的UI嵌入应用程序外壳的某个区域 我有一个登录模块,我想把它拉到我的Elm应用程序的一个区域中。 然而,我不清楚如何做到这一点 具体来说,我如何引导登录模块来呈现我的应用程序外壳中的某个区域将作为UI公开的html 登录模块: module Login exposing (..) import Html exposing (..) import Html.Attributes exposing (..) import Html.Events exposing (..) -- MO

如何将模块的UI嵌入应用程序外壳的某个区域

我有一个登录模块,我想把它拉到我的Elm应用程序的一个区域中。 然而,我不清楚如何做到这一点

具体来说,我如何引导登录模块来呈现我的应用程序外壳中的某个区域将作为UI公开的html

登录模块:

module Login exposing (..)

import Html exposing (..)
import Html.Attributes exposing (..)
import Html.Events exposing (..)


-- MODEL


type alias Model =
    { username : String, password : String }


model : Model
model =
    Model "" ""


init : ( Model, Cmd Msg )
init =
    ( model, Cmd.none )



-- UPDATE


type Msg
    = UserInput String
    | PasswordInput String
    | SignIn String String


update : Msg -> Model -> Model
update msg model =
    case msg of
        UserInput v ->
            model

        PasswordInput v ->
            model

        SignIn username password ->
            model



-- VIEW


view : Model -> Html Msg
view model =
    div []
        [ input [ class "signin", type_ "submit", value "Signin", onClick <| SignIn (model.username) (model.password) ] []
        , input [ class "signin", type_ "password", placeholder "password", onInput PasswordInput, value model.password ] []
        , input [ class "signin", type_ "text", placeholder "username", onInput UserInput, value model.username ] []
        ]
view : Model -> Html Msg
view model =
    div []
        [ header [] [ Login.view ??? ]
        ]
注意:
这是在使用Prism框架进行WPF时编写UX的常用方法。

为此需要做的是将其导入主模块中。然后为登录消息添加另一个顶级消息类型,并在更新函数中为其添加一个案例。代码看起来像这样

import Login

type alias Model =
    { loginModel : Login.Model
    , (more stuff)
    }

type alias Msg
    = HandleLogin Login.Msg
    | (more stuff)

update msg model =
    case msg of
        HandleLogin subMsg ->
            let
                newState = Login.update subMsg model.loginState
             in
                 { model | loginState = newState }
         (more stuff)

 view model =
     div [] [
         Html.map HandleLogin <| Login.view model.loginState
     ]
这将包装由login视图生成的消息,然后将它们传递回login update函数


您可以阅读更多关于Html.map的信息,您需要做的是将其导入主模块中。然后为登录消息添加另一个顶级消息类型,并在更新函数中为其添加一个案例。代码看起来像这样

import Login

type alias Model =
    { loginModel : Login.Model
    , (more stuff)
    }

type alias Msg
    = HandleLogin Login.Msg
    | (more stuff)

update msg model =
    case msg of
        HandleLogin subMsg ->
            let
                newState = Login.update subMsg model.loginState
             in
                 { model | loginState = newState }
         (more stuff)

 view model =
     div [] [
         Html.map HandleLogin <| Login.view model.loginState
     ]
这将包装由login视图生成的消息,然后将它们传递回login update函数


您可以阅读更多关于Html.map的信息,仅供参考:您可以删除
SignIn
union类型的属性,因为这两个字符串存储在您的模型中。您可以在更新功能中访问它们,而无需将它们传入。应用程序的示例如下:(查找
Sub.map
Cmd.map
,并且在View.elm文件中使用
Html.map
)仅供参考:当两个字符串存储在您的模型中时,您可以删除
SignIn
联合类型的属性。您可以在更新功能中访问它们,而无需将它们传入。应用程序的示例如下:(查找
Sub.map
Cmd.map
,并且
Html.map
用于View.elm文件)