Подтвердить что ты не робот

Какая дружественная реакция для анимации переупорядочения списка?

У меня есть список элементов с оценками, упорядоченный по количеству баллов, отображаемый в файле response.js как вертикально-ориентированный список прямоугольных элементов (самые высокие оценки сверху). Пауки и другие клики по отдельным элементам могут отображать/скрывать дополнительную информацию, изменяя их вертикальную высоту.

Появляется новая информация, которая немного меняет оценки, делая некоторые предметы выше, а другие - после повторного сортировки. Я хотел бы, чтобы элементы одновременно отображались на их новых позициях, а не появлялись в их новых местах мгновенно.

Есть ли рекомендуемый способ сделать это в React.js, возможно, с популярным надстройкой?

(В аналогичной прошлой ситуации, использующей D3, метод, который я использовал, был примерно таким:

  • Отобразить список с узлами узла DOM в натуральном порядке с относительным позиционированием. При относительном позиционировании другие небольшие изменения - CSS или JS-triggered - в отношении отдельных предметов меняют другие, как ожидалось.
  • Мутировать все узлы DOM за один шаг, чтобы иметь фактические относительные координаты как новые абсолютные координаты - изменение DOM, которое не вызывает визуальных изменений.
  • Переупорядочить узлы DOM элемента в пределах их родительского элемента в новый порядок сортировки - другое изменение DOM, которое не вызывает визуальных изменений.
  • Анимируйте верхние значения всех узлов в своих новых вычисленных значениях на основе высот всех предыдущих элементов в новом порядке. Это единственный визуально активный шаг.
  • Мутировать все узлы DOM объекта обратно в относительное позиционирование без смещения. Опять же, это не приводит к визуальному изменению, но теперь относительно позиционированные узлы DOM в естественном порядке основного списка будут обрабатывать изменения внутреннего наведения/расширения/etc при правильном переносе.

Теперь я надеюсь на аналогичный эффект в режиме React-ish...)

4b9b3361

Ответ 1

Я только что выпустил модуль для решения именно этой проблемы

https://github.com/joshwcomeau/react-flip-move

Он делает несколько вещей иначе, чем Magic Move/Shuffle:

  • Он использует технику FLIP для аппаратно-ускоренных анимаций 60FPS +.
  • Он предлагает варианты "очеловечивать" тасование путем постепенного смещения задержки или продолжительности.
  • Он обрабатывает прерывания изящно, никаких странных эффектов с ошибками
  • Букет других опрятных вещей, таких как обратные вызовы запуска/завершения

Проверьте демонстрационные версии:

http://joshwcomeau.github.io/react-flip-move/examples/#/shuffle

Ответ 2

Я понимаю, что это немного старый вопрос, и вы, вероятно, нашли решение к настоящему времени, но для тех, кто сталкивается с этим вопросом, ознакомьтесь с библиотекой MagicMove Райаном Флоренс. Это библиотека React для обработки точного сценария, который вы описываете: https://github.com/ryanflorence/react-magic-move

Смотрите в действии: https://www.youtube.com/watch?v=z5e7kWSHWTg#t=424

Изменить: Это нарушено в React 0.14. См. React Shuffle в качестве альтернативы, как показано Тимом Арни ниже.

Ответ 4

Лучший способ, с помощью которого я могу придумать это с моей головы, - сначала убедиться, что вы предоставите каждому из своих элементов ключ, как описано здесь:

http://facebook.github.io/react/docs/multiple-components.html#dynamic-children

Далее я бы определил анимацию CSS3, подобную этой:

Анимированные списки с CSS3

В основном в вашей функции рендеринга вы вычисляете, куда должен идти элемент, ReactJS поместит элемент, где он предположительно будет (убедитесь, что каждый элемент каждый раз имеет один и тот же ключ! Это важно, чтобы повторить ReactJS ваш DOM-элемент). Теоретически, по крайней мере, CSS должен позаботиться о остальной части анимации для вас за пределами реакции /javascript.

Disclamer... Я никогда не пробовал это;)

Ответ 5

Поскольку позиция элемента сильно зависит от механизма DOM, мне очень сложно реализовать анимацию и анимацию в чистом виде внутри компонентов React. Если вы хотите сделать это чисто, я думаю, вам нужно по крайней мере: Store, чтобы удерживать текущую позицию элемента, Store, чтобы удерживать следующую позицию элемента (или комбинировать его с предыдущим хранилищем) и рендеринг (), который применяет поля смещения на элемент до последнего кадра, следующие позиции становятся текущими. То, как вы вычисляете следующие позиции в первую очередь, также является проблемой. Но, учитывая, что элементы только меняют позиции, вы можете использовать Store с текущими позициями для замены элемента # 0 на элемент # 1 путем замены их смещений в следующих положениях Store.

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

Ответ 6

Просто используйте ReactCSSTransitionGroup. Он встроен в пакет React with Addons и идеально подходит для использования в этом случае! Просто убедитесь, что компонент, на котором вы применяете переход, уже установлен в DOM. Используйте CSS, который находится в связанном примере для перехода с хорошим затуханием.