使用哈希標籤
那麼你有一個輕笑了我。
我有這個人在我的Helpers.elm
文件中,我可以用它來代替Html.Events.click
。
{-| Useful for overriding the default `<a>` behavior which
causes a refresh, but can be used anywhere
-}
overrideClick : a -> Attribute a
overrideClick =
Decode.succeed
>> onWithOptions "click"
{ stopPropagation = False
, preventDefault = True
}
所以上a [ overrideClick (NavigateTo "/route"), href "/route" ] [ text "link" ]
這將使中單擊元素以及使用按壓狀態更新導航。
您需要的是與pushState一起使用的JavaScript類似的東西,而且您不想毀掉中間點擊體驗。您可以劫持其所有事件中的所有<a>
s,preventDefault
以停止瀏覽器導航,並通過目標的href推入新狀態。您可以將導航的<a>
s委託給事件處理程序。由於Navigation
運行時不支持在外部監聽歷史記錄更改(而似乎是使用效果管理器),所以必須將該值通過端口推送 - 幸運的是,如果您使用的是Navigation
包,則應該已經有件。
在Elm端,使用UrlParser.parsePath
與Navigation
programs之一結合使用。創建一個端口以訂閱使用與其內部URL更改相同的消息。
import Navigation exposing (Location)
port externalPush : (Location -> msg) -> Sub msg
type Msg
= UrlChange Location
| ...
main =
Navigation.program UrlChange
{ ...
, subscriptions : \_ -> externalPush UrlChange
}
頁面加載後,使用此:
const hijackNavClick = (event) => {
// polyfill `matches` if needed
if (event.target.matches("a[href]")) {
// prevent the browser navigation
event.preventDefault()
// push the new url
window.history.pushState({}, "", event.target.href)
// send the new location into the Elm runtime via port
// assuming `app` is the name of `Elm.Main.embed` or
// whatever
app.ports.externalPush.send(window.location)
}
}
// your nav selector here
const nav = document.querySelector("nav")
nav.addEventListener("click", hijackNavClick, false)
我認爲這是可行的事件監聽到你的錨鏈接連接到的preventDefault並通過端口來傳遞的意圖,榆樹 –
@SimonH似乎是這樣,我正在考慮這個選擇。如果可能的話,我想看看如何留在Elm。 – scoots