0

使用默认试剂模板创建的路由如下所示:

;; -------------------------
;; Routes

(def router
  (reitit/router
   [["/" :index]
    ["/items"
     ["" :items]
     ["/:item-id" :item]]
    ["/about" :about]]))

如果我将其中一个的路径更改为(下面的“/about”为“/test”),为什么它不再起作用?必须有其他东西在驱动路由,但我似乎无法弄清楚是什么。

;; -------------------------
;; Routes

(def router
  (reitit/router
   [["/" :index]
    ["/items"
     ["" :items]
     ["/:item-id" :item]]
    ["/test" :about]]))

无效回复

这是默认的试剂模板(lein new reagent...),我没有更改代码中的任何其他内容。任何帮助将不胜感激。

编辑 - 我在这个函数的 repl 中稍微介绍了一些额外的细节(来自默认模板):

(defn init! []
  (clerk/initialize!)
  (accountant/configure-navigation!
   {:nav-handler
    (fn [path]
      (let [match (reitit/match-by-path router path)
            current-page (:name (:data  match))
            route-params (:path-params match)]
        (reagent/after-render clerk/after-render!)
        (session/put! :route {:current-page (page-for current-page)
                              :route-params route-params})
        (clerk/navigate-page! path)
        ))
    :path-exists?
    (fn [path]
      (boolean (reitit/match-by-path router path)))})
  (accountant/dispatch-current!)
  (mount-root))

在我看来一切都很好。事实上,在 repl 中执行以下步骤成功地将浏览器导航到正确的页面。我仍然无法直接输入网址。

app:problem.core=> (require '[reitit.frontend :as reitit])
nil
app:problem.core=> (reitit/match-by-path router "/test")
{:template "/test",
 :data {:name :about},
 :result nil,
 :path-params {},
 :path "/test",
 :query-params {},
 :parameters {:path {}, :query {}}}
app:problem.core=> (def match (reitit/match-by-path router "/test"))
#'problem.core/match
app:problem.core=> (:name (:data match))
:about
app:problem.core=> (:path-params match)
{}
app:problem.core=> (def current-page (:name (:data match)))
#'problem.core/current-page
app:problem.core=> (page-for current-page)
#'problem.core/about-page
app:problem.core=> (session/put! :route {:current-page (page-for current-page) :route-params {}})
{:route {:current-page #'problem.core/about-page, :route-params {}}}
app:problem.core=>
4

1 回答 1

1

看起来您更改了客户端 in 的路由src/cljs/<project_name>/core.cljs,但没有更改它们在服务器端的路由src/clj/<project_name>/handler.clj(查看def app文件底部附近的下方)。

如果您不熟悉使用 Clojure 开发 Web 应用程序,我建议您查看Luminus,而不是使用 Reagent 模板。这是一种包含更多电池的方法,包含更多文档。《使用 Clojure 进行 Web 开发》一书由同一作者(也是 Reagent 的贡献者)撰写,也推荐阅读。

于 2020-08-01T15:39:17.000 回答