如何在clojurescript中获取查询参数?

Vik*_* K. 9 clojurescript secretary reagent

我正在使用秘书和试剂.这是我的代码:

(def view (atom nil))

(defn layout [view]
  [:div @view])

(reagent/render-component [layout view] (.getElementById js/document "message"))

(secretary/set-config! :prefix "")

(secretary/defroute home-path "/" [query-params]
  (timbre/info "Path : /, query params : " query-params)
  (let [warning (:warning query-params)
        success (:success query-params)
        login-failed (:login_failed query-params)]
    (when warning
      (timbre/info "Warning found : " warning)
      (reset! view [:h4 [:span.label.label-warning warning]]))
    (when success
      (timbre/info "Success found : " success)
      (reset! view [:h4 [:span.label.label-info success]]))
    (when login-failed
      (timbre/info "Login failed")
      (reset! view [:h4 [:span.label.label-warning "Login Failed."]]))))

(let [h (History.)]
 (goog.events/listen h EventType.NAVIGATE #(secretary/dispatch! (.-token %)))
 (doto h
  (.setEnabled true)))
Run Code Online (Sandbox Code Playgroud)

忽略:前缀值(我试过"","#"并且根本没有设置:前缀)此代码仅适用于以下路由:

http://localhost:8080/login#/?success=SuccessMessage
Run Code Online (Sandbox Code Playgroud)

但它不适用于以下路线:

http://localhost:8080/login?success=SuccessMessage
Run Code Online (Sandbox Code Playgroud)

我实际上想要实现的是解析朋友的登录失败,如果失败则重定向我

http://localhost:8080/login?&login_failed=Y&username=someUser
Run Code Online (Sandbox Code Playgroud)

并向用户显示登录失败消息.我不需要使用秘书,任何可以解析查询参数的东西都可以.

困难的方法是解析我可以得到的查询字符串:

(-> js/window .-location .-search)
Run Code Online (Sandbox Code Playgroud)

我相信这在某些图书馆已经做得很好.

Vik*_* K. 15

我找到了.使用https://github.com/cemerick/url(适用于clojure和clojurescript),可以:

(require '[cemerick.url :as url])
(:query (url/url (-> js/window .-location .-href)))
Run Code Online (Sandbox Code Playgroud)