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

10

我正在使用 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)))

忽略 :prefix 值(我尝试了"","#"以及根本不设置 :prefix),这段代码只能处理像这样的路由:

http://localhost:8080/login#/?success=SuccessMessage

但是它不能处理像这样的路由:

http://localhost:8080/login?success=SuccessMessage

我的实际目标是解析friend中的登录失败信息,如果登录失败,会将我重定向到

http://localhost:8080/login?&login_failed=Y&username=someUser

并向用户显示登录失败的消息。我不需要为此使用secretary,可以使用任何可用于解析查询参数的方法。

解析查询字符串的较困难的方法是,可以通过以下方式获取:

(-> js/window .-location .-search)

我相信在一些库中这已经做得很好了。

2个回答

16

我找到了。使用https://github.com/cemerick/url(适用于Clojure和ClojureScript),可以这样做:

(require '[cemerick.url :as url])
(:query (url/url (-> js/window .-location .-href)))

1

来自文档:

如果一个URI包含查询字符串,它将自动被提取到 :query-params 用于字符串路由匹配器,对于正则表达式匹配器,则提取到最后一个元素。

(defroute "/users/:id" [id query-params]
  (js/console.log (str "User: " id))
  (js/console.log (pr-str query-params)))

(defroute #"/users/(\d+)" [id {:keys [query-params]}]
  (js/console.log (str "User: " id))
  (js/console.log (pr-str query-params)))

;; In both instances...
(secretary/dispatch! "/users/10?action=delete")
;; ... will log
;; User: 10
;; "{:action \"delete\"}"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接