【问题标题】:How to define default component in Reagent如何在试剂中定义默认组件
【发布时间】:2019-12-08 07:47:40
【问题描述】:

我正在尝试使用 Reagent 创建 SPA 应用程序。如何定义默认页面/组件?据我了解,我应该将当前页面保存在状态原子中。但是如果我在主页中更改状态,我无法定义它。 例如,在此代码中 home 无法解析(第 1 行):

(defonce app-state (atom {:current-page (home)}))

(defn second-page []
  [:p 2])

(defn home []
  [:div
   [:p 1]
   [:input {:type "button" :value "Click!"
            :on-click #(swap! app-state second-page)}]])

(defn hello-world []
  [:div
   [:input {:type "button" :value "Home" :on-click #(swap! app-state home)}]
   (:current-page @app-state)
   [:h3 "footer"]])

(reagent/render-component [hello-world]
                          (. js/document (getElementById "app")))

【问题讨论】:

    标签: clojurescript reagent


    【解决方案1】:

    有几种方法可以解决此问题。一种方法是创建一个名为 pages 的地图

    (def pages {:home home
                :second second-page
                ....}
    

    然后使用状态原子中的键名,即

    (defonce app-state (atom {:current-page :home})
    

    因为您只是存储了一个关键字,所以不需要前向声明,因为关键字会自行评估。然后在您的代码中,您将使用 :current-page 的值从页面映射中查找组件

    defn hello-world []
      [:div
       [:input {:type "button" :value "Home" :on-click #(swap! app-state home)}]
       ((:current-page @app-state) pages)
       [:h3 "footer"]])
    

    您还可能会发现像 secretary 这样的东西可以作为推广此类想法的一种方法的示例。

    【讨论】:

      【解决方案2】:

      只需使用declarehomesecond-page 的占位符放在原子之前:

      (declare home second-page)
      
      (defonce app-state (atom {:current-page home}))
      

      确保始终保持浏览器选项卡对The Clojure CheatSheet 保持打开状态。有关 Clojure 的 var 功能的工作原理的更多详细信息,另请参阅 this answer

      【讨论】:

      • 感谢您的回答。但在您的情况下,app-state:on-click #(swap! app-state second-page)}] 行中未定义。你能给我一个例子,我如何使用declare 来解决这个问题?我应该使用(declare app-state)(declare home)
      猜你喜欢
      • 2019-01-05
      • 2019-05-02
      • 1970-01-01
      • 1970-01-01
      • 2019-08-15
      • 1970-01-01
      • 2012-06-17
      • 2016-06-29
      • 1970-01-01
      相关资源
      最近更新 更多