Компонент реагента, упорядочивающий участки по их вычисленным размерам
Я ищу способ разработки компонента реагента, который перечисляет слова, отсортированные по их реальной (вычисленной) ширине, которую они имели бы при визуализации в браузере. (не количество символов).
Реальная ширина html-элемента может быть определена методом JavaScript offsetWidth
, Тем не менее, похоже, что для получения результата элемент должен быть добавлен где-то в DOM.
Так что это может быть решено
- создание временного невидимого элемента контейнера
- добавив к нему несколько интервалов, содержащих слова
- сортировать их по их смещению
- повторно их соответственно
Каков будет подход React/Reagent к нему?
1 ответ
Решение
Одним из способов является использование :ref
функция
(defn sorted-by-width []
(let [ss (reagent/atom {"the" nil
"quick" nil
"brown" nil
"fox" nil})]
(fn a-sorted-by-width []
[:ul
(for [[s width] (sort-by val @ss)]
^{:key s}
[:li
[:span
{:ref (fn text-ref [elem]
(when elem
(swap! ss assoc s (.-width (.getBoundingClientRect elem)))))
:visibility (if width "visible" "hidden")}
s]])])))
Функция ref может записывать информацию об элементе.