мультипанельный рефрейм работает не так, как ожидалось - PullRequest
0 голосов
/ 03 марта 2020

У меня есть следующий код рефрейма:

;;sub
(reg-sub
 :active-panel
 (fn [db]
   (:active-panel db)))

;;event
(reg-event-db
 :active-panel
 (fn [db [_ new-panel]]

   (assoc db :active-panel new-panel)
   ))

(defn another []
  (fn []
    [:div

     [:p "another"]

     ]
    )
  )

(defn main []
  (fn []
    [:div
     [button {:label "Button"
              :on-click #(dispatch [:active-panel :another])
              }]
     ]
    ))

(defmulti panels identity)
(defmethod panels :main [] [main])
(defmethod panels :another [] [another])
(defmethod panels nil [] [:p "nil"])
(defn main-panel []
  (let [active-panel (subscribe [:active-panel])]
    (fn []
      (panels @active-panel))))

По сути, на главной панели (по умолчанию) есть кнопка, которая при нажатии должна попасть на: другую панель, но вместо этого она мигает между " ноль "панель и: другая панель. Что я делаю не так?

1 Ответ

0 голосов
/ 06 марта 2020

Ваш пример кода кажется правильным. Когда приложение Re-Frame мигает, это в большинстве случаев вызвано неожиданными отправками. Посмотрите на эти два примера:

;; Correct
[:button {:on-click #(js/alert "I got clicked")}
  "Click me"]

;; Incorrect
[:button {:on-click (js/alert "I got clicked")} ;; notice the missing `#`
  "Click me"]

Если ваш обработчик событий javascript не является функцией, он выполнит оценку, как только компонент выполнит рендеринг, вызывая эффект. Если это dispatch какое-то событие, вы можете создать все oop, заставляя ваше приложение мерцать при рендеринге компонентов.

Так как ваш пример кода мне кажется правильным, я бы посоветовал вам искать такие ошибки в вашем источнике код.

...