evancz/url-parser和多个查询参数

rof*_*rol 6 elm

我不知道如何访问多个查询参数.

源代码中没有示例.

我知道如何使用<?>以下方法获取一个查询参数:

routeParser : Url.Parser (Route -> a) a
routeParser =
    Url.oneOf
        [ Url.map HomeRoute Url.top
        , Url.map SettingsRoute (Url.s "settings" <?> Url.stringParam "sortBy")
        ]


parseLocation : Location -> Route
parseLocation location =
    location
        |> Url.parsePath routeParser
        |> Maybe.withDefault NotFoundRoute
Run Code Online (Sandbox Code Playgroud)

随着parsePath我可以得到Dict与查询参数,但有使用优雅的方式<?>

编辑:

我用这个例子elm-repl:

> parsePath (s "blog" <?> stringParam "search" <?> stringParam "sortBy") (Location "" "" "" "" "" "" "/blog" "?search=cats&sortBy=name" "" "" "")
-- TYPE MISMATCH --------------------------------------------- repl-temp-000.elm

The 1st argument to function `parsePath` is causing a mismatch.

5|   parsePath (s "blog" <?> stringParam "search" <?> stringParam "sortBy") (Location "" "" "" "" "" "" "/blog" "?search=cats&sortBy=name" "" "" "")
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Function `parsePath` is expecting the 1st argument to be:

    Parser (Maybe String -> Maybe String) (Maybe String)

But it is:

    Parser (Maybe String -> Maybe String -> Maybe String) (Maybe String)

Hint: It looks like a function needs 1 more argument.
Run Code Online (Sandbox Code Playgroud)

Cha*_*ert 7

您可以<?>将多个查询参数链接在一起.假设您SettingsRoute还期望一个pageNumber整数参数:

type Route
    = ...
    | SettingsRoute (Maybe String) (Maybe Int)
Run Code Online (Sandbox Code Playgroud)

您的解析器可能如下所示:

Url.map SettingsRoute (Url.s "settings" <?> Url.stringParam "sortBy" <?> Url.intParam "pageNumber")
Run Code Online (Sandbox Code Playgroud)

传入URL中的查询参数不需要与map语句的顺序相同.以下示例将为上述路径提供相同的结果:

settings?sortBy=name&pageNumber=3
settings?pageNumber=3&sortBy=name
Run Code Online (Sandbox Code Playgroud)

编辑

您在REPL中添加了一个示例.您在REPL中遇到的问题是因为您没有正确映射到带有两个参数的内容.考虑REPL的这个例子:

> type alias SearchParams = { search : Maybe String, sortBy : Maybe String }
> parsePath (map SearchParams (s "blog" <?> stringParam "search" <?> stringParam "sortBy")) (Location "" "" "" "" "" "" "/blog" "?search=cats&sortBy=name" "" "" "")
Just { search = Just "cats", sortBy = Just "name" }
    : Maybe.Maybe Repl.SearchParams
Run Code Online (Sandbox Code Playgroud)

  • 我更新了答案,以解决您的REPL问题。原始答案仍然有效,问题出在您尝试在REPL中使用它的方式。 (2认同)