4

我正在使用 re-frame 构建一个单页应用程序。应用程序的每个“页面”调用一个组件base-page,然后提供其特定页面的子...

(defn base-page [& children]
  (into [:div
         ; banner goes here
        ] children))

(register-sub :count
  (fn [db _] (reaction (:count @db))))

(register-handler :inc
  (fn [db _] (update db :count inc)))

(defn test-page []
  (let [count (subscribe [:count])]
    (fn []
      [base-page 
       [:h2 "Test Page"]
       [:p (str "Count: " @count)]])))

这会使用 的初始值正确呈现页面:count,并且当我(dispatch [:inc])正确运行页面更新时。

现在我想base-page成为一个 form-2 组件,这样它就可以拥有自己的订阅......

(defn base-page [& children]
  (let [user (subscribe [:current-user])]
    (fn []
    (into [:div
           ; banner goes here, including @user
          ] children))

但是,当我这样做时,test-page当我运行时计数不再更新(dispatch [:inc])。我觉得这很令人惊讶,因为我认为 Reagent 在幕后将 form-1 和 form-2 组件打包成 form-3 组件。

这是预期的行为吗?如果是这样,是否有更好的方法来实现我的基本页面/具体页面模型?

4

2 回答 2

4

Reagent 文档 (*) 中的规则不是对于 Form-2 组件的外部函数和内部函数必须具有相同的参数吗?

查看此页面上的第二个“新手错误”

(*) 重新构架取决于试剂。有关 Form-1/2/3 组件的文档同样适用于单独使用 Reagent 或来自位于 Reagent 之上的其他框架/库之一。

于 2016-01-04T03:58:46.090 回答
3

正如 Chris Murphy 指出的那样,问题在于我没有将外部参数传递给内部函数。这个定义base-page很好用:

(defn base-page [& children]
  (let [user (subscribe [:current-user])]
    (fn [& children]
    (into [:div
           ; banner goes here, including @user
          ] children))
于 2016-01-03T17:44:32.397 回答