首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >寓言Elmish url改变事件管理而不使用hashbang

寓言Elmish url改变事件管理而不使用hashbang
EN

Stack Overflow用户
提问于 2022-07-26 02:56:36
回答 1查看 46关注 0票数 0

给出以下非常基本的Fable.Lit elmish应用程序

代码语言:javascript
复制
module App
open Elmish
open Elmish.Navigation
open Lit

type Route =
    | Contract
    | Product
    | Chart

type Model = {
    Route_ : Route option }

type Msg = ...

let init route_ = {Route_ = route_}, Cmd.none

let update msg model = ...

let view (model:Model) dispatch = 
    match model.Route_ with
    | None -> ...
    | Some Contract -> ...
    | Some Product -> ...
    | Some Chart -> ...

open Lit.Elmish
open Elmish.UrlParser

let route = oneOf [ 
    map Product (s "product")
    map Contract (s "contract")
    map Chart (s "chart") ]

let urlUpdate (route_: Option<Route>) model = 
    printf "urlUpdate"
    model, Cmd.none

Program.mkProgram init update view
// |> Program.toNavigable (parseHash route) urlUpdate
|> Program.toNavigable (parsePath route) urlUpdate
|> Program.withLit "my-app"
|> Program.run

parseHash没有问题。每当我更改浏览器url中的url时,例如'http://host/#product‘(包括#字符)并按Enter键,就会调用urlUpdate ('urlUpdate’被打印在开发工具控制台中)。

我希望在使用parsePath时,urlUpdate会在url栏中的每一个更改中都被调用。相反,如果更改后的url不包含“#”,则会重新加载页面,并且永远不会调用urlUpdate。

是捕获任何url更改(手动或编程)的正确方法吗?

EN

回答 1

Stack Overflow用户

发布于 2022-10-22 02:00:40

这个路由示例在没有

代码语言:javascript
复制
module Types

[<RequireQualifiedAccess>]
type Route =
    | Home
    
module Route =
    open Elmish.UrlParser
    **let route: Parser<Route -> Route, Route> = oneOf [ map Route.Home top ]**
    let parser location = parsePath route location

代码语言:javascript
复制
module App

[<RequireQualifiedAccess>]
type Page =
    | HomePage of HomePage.Types.HomePage

[<RequireQualifiedAccess>]
type Msg =
    | Nothing
    | HomePageMsg of HomePage.Types.HomePageMsg

type AppModel = {
    CurrentPage: Page
}

let urlUpdate (_route_: Route option) (model: AppModel) : AppModel * Cmd<Msg> =
    match _route_ with
    | Some Route.Home ->
        ...
        ( appModel, Cmd.none)
    | _ -> failwith "no route"

let init (_router_: Route option) : AppModel * Cmd<Msg>  =
    let homePageModel, homePageCmd = HomePage.init
    let homePage = Page.HomePage homePageModel
    let appModel = { CurrentPage = homePage }
    urlUpdate _router_ appModel

let update (msg: Msg) (model: AppModel) =
    match msg with
    | Msg.Nothing ->
       (model, Cmd.none)
    | Msg.HomePageMsg homePageMsg ->
        match model.CurrentPage with
        | Page.HomePage homePageModel ->
            let homePageModel', homePageCmd = HomePage.update homePageMsg homePageModel
            let homePage = Page.HomePage homePageModel'
            let cmd = Cmd.map Msg.HomePageMsg homePageCmd
            let model' = { model with CurrentPage = homePage }
            (model', cmd)
        | _ -> (model, Cmd.none)

let view (model:AppModel) dispatch =
    let pageView =
      match model.CurrentPage with
      | Page.HomePage homePage ->
          HomePage.view homePage (Msg.HomePageMsg >> dispatch)
    pageView

代码语言:javascript
复制
module Main

open Elmish
open Elmish.React
open Elmish.Navigation

Program.mkProgram App.init App.update App.view
|> Program.toNavigable **Types.Route.parser** App.urlUpdate
|> Program.withReactSynchronous "root"
|> Program.run
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73117268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档