重新框架中的嵌套组件不更新

Nested components in re-frame not updating

我正在使用 re-frame 构建单页应用程序。应用程序的每个 "page" 调用一个组件 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 组件。

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

正如 Chris Murphy 所指出的,问题是我没有将外部参数传递给我的内部函数。 base-page 的这个定义工作正常:

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

re-frame 试剂文档 (*) 中不是规定了 Form-2 组件的外部函数和内部函数必须具有相同的参数吗?

查看 this page

上的第二个 'rookie mistake'

(*) re-frame 取决于试剂。关于 Form-1/2/3 组件的文档同样适用于单独使用 Reagent 或使用位于 Reagent 之上的其他 frameworks/libraries 之一。