Задать вопрос
@Gosttlt

Как сделать принудительную перерисовку списка?

//background: red; - для наглядности
Демонстрация самой проблемы https://drive.google.com/file/d/1sru0Nxdr_jRfTMiZi...
или https://vk.com/video502185518_456239018?list=ln-by...

>update<
Сам код. -Обратите внимание, что есть много стороннего кода, так как компонент разрабатывается не только для горизонтали, но и вертикали и вложенных колонок. Так же код сырой постоянно переписывается по этому не такой "чистый".
>/update<

Как сделать поведение при переносе элемента из начала в конец таким, как когда я переношу элемент из конца в начало?

Немного деталей и рассуждений:

Есть массив
const arr = [
  {
    id: "cm0mpet8k0001jxq8albsrcsi",
    name: "Last",
    order: 0,
    __typename: "TaskCategory",
  },
  {
    id: "cm09amfkn000a6fn446tl8mdb",
    name: "Дом",
    order: 1,
    __typename: "TaskCategory",
  },
  {
    id: "cm07udxi3000513evtfpctrtg",
    name: "Фичи",
    order: 2,
    __typename: "TaskCategory",
  },
  {
    id: "cm07udvin000413evpjlxiec4",
    name: "Баги",
    order: 3,
    __typename: "TaskCategory",
  },
];


И при дропе элемента, я меняю ордеры местами и сортирую. Соответственно меняются местами элементы в массиве.

Что происходит, eсли элемент переносить в конец:
  1. Происходит полная перерисовка DOM перетаскиваемого элемента, что сбрасывает анимацию transition,transform:scale
  2. Элементы которые остались позади не разрушают DOM и продолжая анимацию начинают возвращаться назад, но так как перед ними появился новый DOM-элемент происходит смещение влево и выгладит как скачок.

Что происходит, eсли элемент переносить в начало:
  1. Перетаскиваемый элемент перерисовывается без разрушения DOM и плавно появляется в нужном месте продолжая анимацию
  2. Элементы что остались впереди разрушают DOM и появляются по новой сбрасывая анимацию и остаются на том месте которое мне нужно.


Собственно вопросы:
  1. Почему React разрушает DOM-элементы у которых key остается стабильным. И делает он это только в том случае, если дом элемент переместился из конца в начало списка.
  2. Почему во втором пункте элементы, что остались спереди перетаскиваемого элемента при дропе сбрасывают анимацию и перерисовываются именно в тот момент, когда перетаскиваемый элемент появился перед ними в DOM не происходит не каких рывков при сбросе стиля, все плавно происходит и одновременно DOM перетаскиваемого элемента монтируется в начало списка и в этот же момент стили сбрасываются у спереди стоящих элементов эти 2 перерисовки как-то группируются в 1 рефлоу. Я пытался добиться такого же эффекта, но у меня не получалось сгруппировать эти 2 перерисовки путем сбрасывания transition в момент дропа получается рывок.
  • Вопрос задан
  • 112 просмотров
Подписаться 1 Средний 2 комментария
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы