Clojurescript/Reagent/Chart.js — Жизненный цикл реагента — chart.update()

Мы используем chart.js с clojurescript и Reagent. Теперь я знаю, что в Chart.js есть метод chart.update() для обновления диаграммы новыми данными. Итак, вопрос в том, как я могу настроить свой компонент так, чтобы он отображал диаграмму на :regent-render, но, вероятно, получал :component-will-update для вызова метода chart.update()?

По сути, есть ли способ получить дескриптор диаграммы, созданной из функции :regent-render в функции :component-will-update?


person Amit Shah    schedule 10.11.2017    source источник


Ответы (1)


Обычный шаблон, которому вы следуете в этом случае, состоит в том, чтобы обернуть объект с состоянием/изменяемый в компонент React и использовать методы жизненного цикла React.

Подход подробно описан в re-frame. Using-Stateful-JS-Component, но я обычно делаю это с D3:

(defn graph-render [graph-attrs graph-data]
  ;; return hiccup for the graph here
  (let [width (:width graph-attrs)
        height (:height graph-attrs)]
    [:svg {:width width :height height}
     [:g.graph]]))

(defn graph-component [graph-attrs graph-data]
  (r/create-class
   {:display-name "graph"
    :reagent-render graph-render
    :component-did-update (fn [this]
                            (let [[_ graph-attrs graph-data] (r/argv this)]
                              (update! graph-attrs graph-data)))
    :component-did-mount (fn [this]
                           (let [[_ graph-attrs graph-data] (r/argv this)]
                             (init! graph-attrs graph-data)))}))

(defn container []
  [:div {:id "graph-container"}
   [graph-component
    @graph-attrs-ratom
    @graph-data-ratom]])

Важно сохранить комбинацию внешнего и внутреннего, потому что в противном случае React не будет правильно заполнять свои реквизиты.

Еще одна вещь, с которой нужно быть осторожным, — это возврат вектора reagent/argv, который, как вы можете видеть, содержит свойства после первого элемента. Я видел (reagent/props comp) на вики-странице выше, но сам никогда не пробовал.

person Andrea Richiardi    schedule 31.07.2018