首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Reagent中定义默认组件

如何在Reagent中定义默认组件
EN

Stack Overflow用户
提问于 2019-07-31 04:46:07
回答 2查看 118关注 0票数 0

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

代码语言:javascript
复制
(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")))
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-03 16:51:56

有几种方法可以解决这个问题。一种方法是创建一个名为pages的地图,如下所示

代码语言:javascript
复制
(def pages {:home home
            :second second-page
            ....}

然后在状态atom中使用键名,即

代码语言:javascript
复制
(defonce app-state (atom {:current-page :home})

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

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

你可能还会发现像secretary这样的东西很有用,可以作为推广这类想法的一个例子。

票数 2
EN

Stack Overflow用户

发布于 2019-07-31 09:42:56

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

代码语言:javascript
复制
(declare home second-page)

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

确保始终保持浏览器选项卡对The Clojure CheatSheet处于打开状态。有关this answervar特性工作原理的更多详细信息,请参阅Clojure。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57279775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档