React-dnd: Как ΠΎΡ‚Π»Π°Π΄ΠΈΡ‚ΡŒ "НСвозмоТно Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π½Π°Π²Π΅Π΄Π΅Π½ΠΈΠ΅ послС падСния"?

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 19 Π°ΠΏΡ€. 2016  Β·  24ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: react-dnd/react-dnd

ΠŸΡ€ΠΈΠ²Π΅Ρ‚,
ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΌΠΎΠΈΡ… ΠΊΠΎΠ»Π»Π΅Π³ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΊΠ°ΠΊΠΈΠΌ-Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π½Π°Ρ€ΡƒΡˆΠΈΡ‚ΡŒ состояниС ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π°, ΠΈ ΠΎΠ½ Π΄ΡƒΠΌΠ°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½ зависаСт, Π΄Π°ΠΆΠ΅ Ссли ΠΌΡ‹ΡˆΡŒ поднята, ΠΈ Π΄Π°Π΅Ρ‚ Π΅ΠΌΡƒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

screenshot 2016-04-19 16 34 56

Π•ΡΡ‚ΡŒ ΠΈΠ΄Π΅ΠΈ, с Ρ‡Π΅Π³ΠΎ Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ? Π― Π½Π΅ ΠΌΠΎΠ³Ρƒ воспроизвСсти это, ΠΈ ΠΎΠ½ Π²ΠΈΠ΄ΠΈΡ‚ это Ρ€Π°Π· Π² нСдСлю.
Π― ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ сСнсорный бэкэнд, ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΉ Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ событий ΠΌΡ‹ΡˆΠΈ, с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ настройками.

Π‘Π°ΠΌΡ‹ΠΉ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π£ мСня Ρ‚ΠΎΠΆΠ΅ Π΅ΡΡ‚ΡŒ эта ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° - моя ситуация Ρ‚Π°ΠΊΠΎΠ²Π°, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ React являСтся ΠΈ Ρ†Π΅Π»ΡŒΡŽ пСрСтаскивания, ΠΈ источником пСрСтаскивания. Когда Ρƒ мСня Π΅ΡΡ‚ΡŒ Π΄Π²Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°, я ΠΌΠΎΠ³Ρƒ ΠΏΠ΅Ρ€Π΅Ρ‚Π°Ρ‰ΠΈΡ‚ΡŒ ΠΈΡ… ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ указанная Π²Ρ‹ΡˆΠ΅ ошибка. Когда Ρƒ мСня Ρ‚Ρ€ΠΈ, Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π±Π΅Π· ошибок. Π― полагаю, это ΠΊΠ°ΠΊ-Ρ‚ΠΎ связано с мноТСством контСкстов Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π΅?

ВсС 24 ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π˜Ρ‚Π°ΠΊ, исслСдовав ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ JS, я ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ», Ρ‡Ρ‚ΠΎ Π΄ΠΎ этой ошибки Π±Ρ‹Π»Π° ошибка, вызванная ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΌ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π·Π°Ρ‚Π΅ΠΌ ΠΌΠΎΠ³Π»ΠΎ Π½Π°Ρ€ΡƒΡˆΠΈΡ‚ΡŒ состояниС ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π° / Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°.

Π£ мСня Ρ‚ΠΎΠΆΠ΅ Π΅ΡΡ‚ΡŒ эта ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° - моя ситуация Ρ‚Π°ΠΊΠΎΠ²Π°, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ React являСтся ΠΈ Ρ†Π΅Π»ΡŒΡŽ пСрСтаскивания, ΠΈ источником пСрСтаскивания. Когда Ρƒ мСня Π΅ΡΡ‚ΡŒ Π΄Π²Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°, я ΠΌΠΎΠ³Ρƒ ΠΏΠ΅Ρ€Π΅Ρ‚Π°Ρ‰ΠΈΡ‚ΡŒ ΠΈΡ… ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ указанная Π²Ρ‹ΡˆΠ΅ ошибка. Когда Ρƒ мСня Ρ‚Ρ€ΠΈ, Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π±Π΅Π· ошибок. Π― полагаю, это ΠΊΠ°ΠΊ-Ρ‚ΠΎ связано с мноТСством контСкстов Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π΅?

Π£ мСня Π±Ρ‹Π»Π° эта ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, ΠΈ Π²Ρ‡Π΅Ρ€Π° Π²Π΅Ρ‡Π΅Ρ€ΠΎΠΌ я нашСл ΠΎΠ±Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡƒΡ‚ΡŒ для своСго ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° использования.

Для контСкста я Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ» список DragSources, ΠΈ Ссли ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΈΠ· Π½ΠΈΡ… Π±Ρ‹Π» ΠΏΠ΅Ρ€Π΅Ρ‚Π°Ρ‰Π΅Π½ Π½Π° DropTarget, ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ Π±Ρ‹ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹ ΠΈΠ· списка DragSources, Π° DropTarget Π±Ρ‹Π» Π±Ρ‹ Π·Π°ΠΌΠ΅Π½Π΅Π½ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ содСрТимоС DragSource.

Π’Π°ΠΆΠ½ΠΎΠΉ Ρ‡Π°ΡΡ‚ΡŒΡŽ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ пСрСтаскивания (это ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для сопоставлСния Β«ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΉΒ» с элСмСнтами) Π±Ρ‹Π»Π° функция для добавлСния элСмСнтов ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² список DragSource, которая просто замСняла Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π½Ρ‹ΠΉ элСмСнт Π½Π° DragSource ΠΈ добавляла Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² DragSources. список.

image

Π’Π΅ΠΏΠ΅Ρ€ΡŒ это ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π»ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° я ΠΏΠΎΠΌΠ΅Ρ‰Π°Π» элСмСнты Π²ΠΎ всС ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ ΠΈ удалял хотя Π±Ρ‹ ΠΎΠ΄Π½Ρƒ (Π° Π½Π΅ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° список Π±Ρ‹Π» Π½Π΅ΠΏΠΎΠ»Π½Ρ‹ΠΌ, ΠΈ я Π±Ρ‹ ΡƒΠ΄Π°Π»ΠΈΠ» ΠΎΠ΄ΠΈΠ½ ΠΈ снова Π΄ΠΎΠ±Π°Π²ΠΈΠ» Π΅Π³ΠΎ). Π˜Ρ‚Π°ΠΊ, я ΠΏΡ€ΠΈΡˆΠ΅Π» ΠΊ Π²Ρ‹Π²ΠΎΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ список DragSources Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π½ΡƒΠ»Π΅Π²Ρ‹Ρ… Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… элСмСнтов, Ρ‡Ρ‚ΠΎΠ±Ρ‹ это ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΈΠ·-Π·Π° исчСзновСния элСмСнта ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, Π½ΠΎ Ρƒ мСня Π½Π΅ Π±Ρ‹Π»ΠΎ достаточно Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ это). Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΌΡΠ³Ρ‡ΠΈΡ‚ΡŒ это, вмСсто удалСния элСмСнтов ΠΈΠ· списка DragSources ΠΏΡ€ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ я просто установил ΠΈΡ… ΡΡ‚ΠΈΠ»ΡŒ Π½Π° display: none

Π­Ρ‚ΠΎ слоТно ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚ΡŒ, Π½ΠΎ я надСюсь, Ρ‡Ρ‚ΠΎ это ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚.

Π― ΠΈΡΠΏΡ‹Ρ‚Ρ‹Π²Π°ΡŽ Ρ‚ΠΎΡ‚ ΠΆΠ΅ эффСкт, Ρ‡Ρ‚ΠΎ ΠΈ @PendragonDevelopment. Мой список начинаСтся с ΠΎΠ΄Π½ΠΎΠ³ΠΎ элСмСнта, ΠΊ Π½Π΅ΠΌΡƒ добавляСтся Π²Ρ‚ΠΎΡ€ΠΎΠΉ, Π° Π·Π°Ρ‚Π΅ΠΌ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΄Π²Π° элСмСнта Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π½Π°Ρ‡Π½Π΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ ошибки Javascript, ΠΈ Π²Ρ‹ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ смоТСтС ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈΡ… порядок снова.

Π£ мСня Ρ‚ΠΎΠΆΠ΅ Π΅ΡΡ‚ΡŒ эта ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°
НС знаю ΠΏΠΎΡ‡Π΅ΠΌΡƒ, Π½ΠΎ послС ΠΏΠ΅Ρ€Π²ΠΎΠΉ пСрСстановки Π²ΠΈΠΆΡƒ эти ошибки

Π£ мСня такая ΠΆΠ΅ ошибка.

ПослС Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ сравнСния дСмонстрационного ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΈ ΠΌΠΎΠ΅Π³ΠΎ я ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ», Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° я Π·Π°Ρ†ΠΈΠΊΠ»ΠΈΠ²Π°ΡŽ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹, я ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ ΠΊΠ»ΡŽΡ‡ массива для установки ΠΊΠ°ΠΊ ΠΊΠ»ΡŽΡ‡Π°, Ρ‚Π°ΠΊ ΠΈ индСкса ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°, Π° Π² дСмонстрации ΠΎΠ½ΠΈ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ индСкс Sortable / Simple / Container.js, Π° ΠΊΠ»ΡŽΡ‡ фиксируСтся.

Π‘Π΄Π΅Π»Π°Π» ΠΈ Π·Π°Ρ€Π°Π±ΠΎΡ‚Π°Π»!

ΠšΠ»ΡŽΡ‡ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ фиксированноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ if Π½Π΅ являСтся ссылкой Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, которая тСряСтся послС измСнСния порядка массива.

Когда Π²Ρ‹ динамичСски создаСтС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚Π΅ DnD, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ ΠΈΠ»ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Date.now() сдСлаСт это для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠ»ΡŽΡ‡Π΅ΠΉ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°.

{this.state.rows.map(function(row, key) {
  return (<RowComponent key={row.id} index={key} id={row.id} moveRow={that.moveRow} />);
})}

row.id ΡƒΠ½ΠΈΠΊΠ°Π»Π΅Π½ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°

Π― Π½Π΅ понимаю, ΠΏΠΎΡ‡Π΅ΠΌΡƒ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π½ΠΎ использованиС ΠΌΠΎΠ΅Π³ΠΎ model.id вмСсто случайного ΠΊΠ»ΡŽΡ‡Π°, сгСнСрированного node-uuid's v4 исправило Π΅Π³ΠΎ. По ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, я большС Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽ ошибок.

Π Π΅ΠΌΠΎΠ½Ρ‚ ΠΊΠ»ΡŽΡ‡Π° Π½Π΅ Ρ€Π΅ΡˆΠΈΠ» мою ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ.
Π­Ρ‚ΠΎ Π±Ρ‹Π» ΠΌΠΎΠΉ ΠΊΠΎΠ΄

           <ContentPatch>
             {tasks.loading 
              ? <div>...loading </div>
              : this.state.containers.map((item, i) => {
                  return (
                    <TaskStage
                      key={item.id}
                      item={item}
                      tasklist={tasks.tasks}
                      onDropped={this.handleDropped}
                      onBeginningDrag={this.onBeginningDrag}
                    />
                  );
                })}
          </ContentPatch>

ПослС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ±Ρ€ΠΎΡˆΠ΅Π½Π½ΠΎΠ³ΠΎ дСйствия я ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π» всС элСмСнты ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π» Ρ‚Ρƒ ΠΆΠ΅ ΠΎΡˆΠΈΠ±ΠΊΡƒ.
И я ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ» своС состояниС Π½Π°

...
{tasks.loading && tasks.tasks.length===0
 ? <div>...loading </div>
...

ΠΈ это Ρ€Π΅ΡˆΠ΅Π½ΠΎ. Π”ΡƒΠΌΠ°ΡŽ, ΠΎΠΏΡΡ‚ΡŒ ΠΆΠ΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ этой ошибки являСтся ΠΌΠΎΠ½Ρ‚Π°ΠΆ.

Π― столкнулся с Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ ошибкой.

Мой Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ использования Π±Ρ‹Π»:

  • ΠžΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ DragSource ΠΈ DragTarget
  • ΠŸΡ€ΠΈ ΠΏΠ°Π΄Π΅Π½ΠΈΠΈ я Ρ…ΠΎΡ‚Π΅Π» ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Ρƒ

ΠžΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ΡΡ, endDrag ( DragSource method) срабатываСт послС drop ( DropTarget method). Π― управлял Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΠ΅ΠΉ ΠΏΠΎ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Ρƒ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… drop Ρ‡Ρ‚ΠΎ Π½Π°Ρ€ΡƒΡˆΠ°Π»ΠΎ состояниС ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π°.

Π­Ρ‚Π° Π»ΠΎΠ³ΠΈΠΊΠ° пСрСнСсСна Π² endDrag Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ это. Π Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³ Π²ΠΊΠ»ΡŽΡ‡Π°Π» ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Ρ‚ΠΎΠ³ΠΎ, Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΎ Π»ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ monitor.didDrop() , Π½ΠΎ это Π±Ρ‹Π»ΠΎ Π½Π΅ Ρ‚Π°ΠΊ ΡƒΠΆ ΠΏΠ»ΠΎΡ…ΠΎ.

Π£ мСня Ρ‚ΠΎΠΆΠ΅ Π΅ΡΡ‚ΡŒ эта ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°. Π’ ΠΌΠΎΠ΅ΠΌ случаС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ являСтся ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Ρ†Π΅Π»ΡŒΡŽ пСрСтаскивания ΠΈ источником пСрСтаскивания. Π― попытался ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ endDrag ΠΈ попытался ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ исправлСнный бэкэнд (https://gist.github.com/nickpresta/eb5cce69d650db4c2795). Π­Ρ‚ΠΎ Π½Π΅ Ρ€Π΅ΡˆΠΈΠ»ΠΎ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ.

ΠΌΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚:

@DropTarget<HeadColOwnProps>(TaskDndTypes.headCol, headColTargetSpec, headColTargetCollector)
@DragSource<HeadColOwnProps>(TaskDndTypes.headCol, headColSourceSpec, headColSourceCollector)
class HeadColComponent extends React.Component<any, void> {
    render() {
        const props = this.props;
        return this.props.dndConnectDropTarget(
            this.props.dndConnectDragPreview(
                <div>
                    <div className={block('panels-task__drag')({start: props.dndIsDragging})}>
                        <SortingIcon
                            label={props.label}
                            arrowIsVisible={props.sortingIsPossible}
                            direction={props.sortingDirection}
                            clickHandler={props.sortingHandler}
                        />
                        {this.props.dndConnectDragSource(
                            <span className="panels-task__drag-control">
                                <SVGIcon width={10} height={10} url={'#icon-drag-and-drop-cell'} />
                            </span>
                        )}
                    </div>
                </div>
            )
        );
    }
}

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования:

const renderHeadCellId = (): JSX.Element => {
        return (
            <TaskCellHead key="key-head-col-id" modifications={{ number: true }}>
                <HeadColComponent
                    label="#"
                    key="key-dnd-head-col-id"
                    taskColType={TaskCols.id}
                    sortingIsPossible={false}
                    taskColsOrder={taskStore.orderCols}
                    updateDragProcess={(dp: TaskColDragProcess | null) => taskStore.updateDragProcess(dp)}
                    updateOrderCols={(order: TaskCols[]) => taskStore.updateOrderCols(order)}
                    dragProcess={taskStore.dragProcess}
                />
            </TaskCellHead>
        );
    };

Настройки Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Π°:

const headColSourceSpec: DragSourceSpec<HeadColOwnProps> = {
    beginDrag(props: HeadColOwnProps): DraggedItem {
        return { sourceColType: props.taskColType };
    },
    canDrag(props: HeadColOwnProps): boolean {
        return props.taskColsOrder.length > 1;
    },
    endDrag(props: HeadColOwnProps, monitor: DragSourceMonitor): void {
        console.debug('endDrag');
        if (!monitor.didDrop()) {
            return;
        }
        console.debug('endDrag finish');
        props.updateOrderCols((monitor.getDropResult() as DroppedResult).newOrderCols);
    }
};

const headColTargetSpec: DropTargetSpec<HeadColOwnProps> = {
    drop(props: HeadColOwnProps, monitor: DropTargetMonitor): DroppedResult {
        console.debug('drop');
        return {
            newOrderCols: getNewOrder((monitor.getItem() as DraggedItem).sourceColType, props.taskColsOrder, props.dragProcess)
        };
    },
    hover(props: HeadColOwnProps, monitor: DropTargetMonitor, component: HeadColComponent): Object | void {
        if (!monitor.canDrop()) {
            return;
        }
        // ...
        props.updateDragProcess(currentDragProcess);
    },
    canDrop(props: HeadColOwnProps, monitor: DropTargetMonitor): boolean {
        return props.taskColType !== (monitor.getItem() as DraggedItem).sourceColType;
    }
};

const headColSourceCollector = (connect: DragSourceConnector, monitor: DragSourceMonitor) => ({
    dndConnectDragSource: connect.dragSource(),
    dndConnectDragPreview: connect.dragPreview(),
    dndIsDragging: monitor.isDragging()
});

const headColTargetCollector = (connect: DropTargetConnector, monitor: DropTargetMonitor) => {
    return {
        dndConnectDropTarget: connect.dropTarget(),
        dndIsOverCurrent: monitor.isOver({ shallow: true })
    };
};

Π—Π°ΠΌΠ΅Ρ‚ΠΈΠ», Ρ‡Ρ‚ΠΎ послС пСрСстановки endDrag Π½Π΅ вызываСтся, Π° вызываСтся drop . Π­Ρ‚ΠΈ строки Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ:

endDrag(props: HeadColOwnProps, monitor: DragSourceMonitor): void {
        console.debug('endDrag');
        if (!monitor.didDrop()) {
            return;
        }
        console.debug('endDrag finish');
        props.updateOrderCols((monitor.getDropResult() as DroppedResult).newOrderCols);
    }

Π§Ρ‚ΠΎ я дСлаю Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ? Π•ΡΡ‚ΡŒ ΠΈΠ΄Π΅ΠΈ?

Π― Π·Π°ΠΌΠ΅Π½ΠΈΠ» HTML5Backend Π½Π° Touch Backend (https://github.com/yahoo/react-dnd-touch-backend). МСня устраиваСт.

Для мСня я ΠΏΠΎΠ»ΡƒΡ‡Π°Π» эту ΠΎΡˆΠΈΠ±ΠΊΡƒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ Π±Ρ‹Π»ΠΈ установлСны Ρ‚ΠΎΡ‡ΠΊΠΈ останова. Π§Ρ‚ΠΎ интСрСсно, это Π½Π΅ сработаСт Π΄Π°ΠΆΠ΅ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ всС Ρ‚ΠΎΡ‡ΠΊΠΈ останова Π±Ρ‹Π»ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½Ρ‹ ΠΈ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ Π½Π΅ Π±Ρ‹Π» приостановлСн. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ я ΡƒΠ΄Π°Π»ΠΈΠ» Ρ‚ΠΎΡ‡ΠΊΠΈ останова, ошибка исчСзла.

Π£ мСня такая ΠΆΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°. Π—Π°ΠΌΠ΅Π½ΠΈΠ» этот ΠΏΠ°ΠΊΠ΅Ρ‚ Π½Π° response-dnd-touch-backend, Π½ΠΎ это Π½Π΅ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ. Π― Π±Ρ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Π΅Π» Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ html5. ΠŸΡ€ΠΎΠ±ΠΎΠ²Π°Π» ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡ΠΈ для всСх элСмСнтов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ΅Ρ‡Π°Ρ‚Π°ΡŽΡ‚ΡΡ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ.

Π― ΠΏΠΎΠ»ΡƒΡ‡Π°Π» Ρ‚Ρƒ ΠΆΠ΅ ΠΎΡˆΠΈΠ±ΠΊΡƒ. Π― ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ примСнял HOC ΠΊ пСрСтаскиваСмым ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Ρ€Π΅Π½Π΄Π΅Ρ€Π΅, поэтому ΠΎΠ½ΠΈ всСгда Π±Ρ‹Π»ΠΈ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ, Ρ‡Ρ‚ΠΎ сбивало с Ρ‚ΠΎΠ»ΠΊΡƒ react-dnd.

@hakunin , Π²Ρ‹ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΠ»ΠΈ это (я Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽ эту ΠΎΡˆΠΈΠ±ΠΊΡƒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»Π° другая ошибка Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния).

Π‘ Ρ‚Π΅Ρ… ΠΏΠΎΡ€ я Ρ€Π΅ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π» вСсь ΠΊΠΎΠ΄ DnD, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρƒ мСня Π΅ΡΡ‚ΡŒ, ΠΈ всС Π΅Ρ‰Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽ Π΅Π³ΠΎ, ΠΊΠΎΠ³Π΄Π° Π½Π°Ρ‡ΠΈΠ½Π°ΡŽ ΠΏΠ΅Ρ€Π΅Ρ‚Π°ΡΠΊΠΈΠ²Π°Ρ‚ΡŒ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° я пСрСмСстил вСсь ΠΊΠΎΠ΄ Π² ΠΎΠ΄ΠΈΠ½ Ρ„Π°ΠΉΠ» ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ ΠΈ сдСлал Π΅Π³ΠΎ настраиваСмым, я ΠΌΠΎΠ³ Π±Ρ‹ Π½Π°ΠΊΠΎΠ½Π΅Ρ† Π½Π°ΠΉΡ‚ΠΈ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ это происходит Π² ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚. Π― Π½Π°ΠΏΠΈΡˆΡƒ ΠΎΠ± этом здСсь, ΠΊΠΎΠ³Π΄Π° сдСлаю это. (Π― ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ TouchBackend Π² настройках ΠΌΡ‹ΡˆΠΈ, кстати)

Бпасибо Π·Π° ΠΎΡ‚Π²Π΅Ρ‚. Π― ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽ эту ΠΎΡˆΠΈΠ±ΠΊΡƒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ пСрСтаскивании Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ другая ошибка - ΠΈ Π² этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π΅Π΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ. это Ρ‚ΠΎ ΠΆΠ΅ самоС для вас?

Моя ТалуСтся ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° я Π½Π°Ρ‡ΠΈΠ½Π°ΡŽ Ρ‚Π°Ρ‰ΠΈΡ‚ΡŒ.

Π’ ΠΌΠΎΠ΅ΠΌ случаС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π² endDrag (props, monitor, component) Π±Ρ‹Π» Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ элСмСнт Π±Ρ‹Π» ΡƒΠ΄Π°Π»Π΅Π½. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ это Π²Ρ‹Π·Ρ‹Π²Π°Π»ΠΎ мою ΠΈΡΡ…ΠΎΠ΄Π½ΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ, которая ΠΏΡ€ΠΈΠ²Π΅Π»Π° ΠΊ ΠΊΠΎΠ½ΡΠΎΠ»ΡŒΠ½ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ сообщСний «НСвозмоТно Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π½Π°Π²Π΅Π΄Π΅Π½ΠΈΠ΅ послС сброса».

МнС ΡƒΠ΄Π°Π»ΠΎΡΡŒ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ благодаря этому ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΡŽ: https://github.com/react-dnd/react-dnd/issues/431#issuecomment -317219509

Π― встрСчал это, ΠΊΠΎΠ³Π΄Π° Ρ€Π°Π½ΡŒΡˆΠ΅ Π²Ρ‹Π·Ρ‹Π²Π°Π» Π΄Ρ€ΡƒΠ³ΡƒΡŽ Π½Π΅Π²Ρ‹ΡΠ²Π»Π΅Π½Π½ΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ. Π­Ρ‚ΠΎΠΉ ошибки Π½Π΅ Π±Ρ‹Π»ΠΎ, ΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±Ρ‹Π»ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… ошибок.

Π’ ΠΌΠΎΠ΅ΠΌ случаС это ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ, ΠΊΠΎΠ³Π΄Π° Π² endDrag я Π²Ρ‹Π·Ρ‹Π²Π°ΡŽ дСйствиС / Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ. Π˜Ρ‚Π°ΠΊ, Π² основном нСобработанная ошибка ΠΏΡ€ΠΈΠ²Π΅Π»Π° ΠΊ зависанию dnd. Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ try catch ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ / дСйствия Π² Π±Π»ΠΎΠΊΠ΅ endDrag.
endDrag: (props, monitor) => { try { handleEndDrag(); } catch(errror) { console.error(error)} }

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ onDrop Ρ‚Π°ΠΊΠΆΠ΅ Π±Ρ‹Π» для мСня источником ошибки. Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ Π΅Π³ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΈΡΡ‡Π΅Π·Π½ΠΎΠ²Π΅Π½ΠΈΡŽ ошибки, Π½ΠΎ Ρ‚ΠΎΠ³Π΄Π° ΠΌΠ½Π΅ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΠΎΡ‚Π»Π°ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π±Π΅Π· Π½Π΅Π΅.

Π•ΡΡ‚ΡŒ ΠΈΠ΄Π΅ΠΈ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ эту ΠΎΡˆΠΈΠ±ΠΊΡƒ?

НС ΡƒΠ²Π΅Ρ€Π΅Π½, Ρ‡Ρ‚ΠΎ это интСрСсно, Π½ΠΎ я ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Electron.

Π­Ρ‚Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π±Ρ‹Π»Π° автоматичСски ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Π° ΠΊΠ°ΠΊ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ°Ρ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² послСднСС врСмя Π½Π΅ Π±Ρ‹Π»ΠΎ активности. Он Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΊΡ€Ρ‹Ρ‚, Ссли большС Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ активности. Бпасибо Π·Π° ваш Π²ΠΊΠ»Π°Π΄.

Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ

Π‘ΠΌΠ΅ΠΆΠ½Ρ‹Π΅ вопросы

dant00ine picture dant00ine  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

antoineBernard picture antoineBernard  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

vickyvxr picture vickyvxr  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

croraf picture croraf  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

redochka picture redochka  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ