ΠΡΠΈΠ²Π΅Ρ,
ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΌΠΎΠΈΡ
ΠΊΠΎΠ»Π»Π΅Π³ ΠΌΠΎΠΆΠ΅Ρ ΠΊΠ°ΠΊΠΈΠΌ-ΡΠΎ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ Π½Π°ΡΡΡΠΈΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΌΠΎΠ½ΠΈΡΠΎΡΠ°, ΠΈ ΠΎΠ½ Π΄ΡΠΌΠ°Π΅Ρ, ΡΡΠΎ ΠΎΠ½ Π·Π°Π²ΠΈΡΠ°Π΅Ρ, Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΠΌΡΡΡ ΠΏΠΎΠ΄Π½ΡΡΠ°, ΠΈ Π΄Π°Π΅Ρ Π΅ΠΌΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅:
ΠΡΡΡ ΠΈΠ΄Π΅ΠΈ, Ρ ΡΠ΅Π³ΠΎ Π½Π°ΡΠ°ΡΡ ΠΎΡΠ»Π°Π΄ΠΊΡ? Π― Π½Π΅ ΠΌΠΎΠ³Ρ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅ΡΡΠΈ ΡΡΠΎ, ΠΈ ΠΎΠ½ Π²ΠΈΠ΄ΠΈΡ ΡΡΠΎ ΡΠ°Π· Π² Π½Π΅Π΄Π΅Π»Ρ.
Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ΅Π½ΡΠΎΡΠ½ΡΠΉ Π±ΡΠΊΡΠ½Π΄, ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½Π½ΡΠΉ Π½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΡΠΎΠ±ΡΡΠΈΠΉ ΠΌΡΡΠΈ, Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°ΠΌΠΈ.
ΠΡΠ°ΠΊ, ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π² ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ JS, Ρ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ», ΡΡΠΎ Π΄ΠΎ ΡΡΠΎΠΉ ΠΎΡΠΈΠ±ΠΊΠΈ Π±ΡΠ»Π° ΠΎΡΠΈΠ±ΠΊΠ°, Π²ΡΠ·Π²Π°Π½Π½Π°Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ ΠΎΠ±ΡΠ°ΡΠ½ΡΠΌ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΡΠΈ ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅, ΡΡΠΎ Π·Π°ΡΠ΅ΠΌ ΠΌΠΎΠ³Π»ΠΎ Π½Π°ΡΡΡΠΈΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΌΠΎΠ½ΠΈΡΠΎΡΠ° / Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ°.
Π£ ΠΌΠ΅Π½Ρ ΡΠΎΠΆΠ΅ Π΅ΡΡΡ ΡΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° - ΠΌΠΎΡ ΡΠΈΡΡΠ°ΡΠΈΡ ΡΠ°ΠΊΠΎΠ²Π°, ΡΡΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ React ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΈ ΡΠ΅Π»ΡΡ ΠΏΠ΅ΡΠ΅ΡΠ°ΡΠΊΠΈΠ²Π°Π½ΠΈΡ, ΠΈ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΎΠΌ ΠΏΠ΅ΡΠ΅ΡΠ°ΡΠΊΠΈΠ²Π°Π½ΠΈΡ. ΠΠΎΠ³Π΄Π° Ρ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ Π΄Π²Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°, Ρ ΠΌΠΎΠ³Ρ ΠΏΠ΅ΡΠ΅ΡΠ°ΡΠΈΡΡ ΠΈΡ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·, ΠΏΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ ΡΠΊΠ°Π·Π°Π½Π½Π°Ρ Π²ΡΡΠ΅ ΠΎΡΠΈΠ±ΠΊΠ°. ΠΠΎΠ³Π΄Π° Ρ ΠΌΠ΅Π½Ρ ΡΡΠΈ, ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π±Π΅Π· ΠΎΡΠΈΠ±ΠΎΠΊ. Π― ΠΏΠΎΠ»Π°Π³Π°Ρ, ΡΡΠΎ ΠΊΠ°ΠΊ-ΡΠΎ ΡΠ²ΡΠ·Π°Π½ΠΎ Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠΎΠ² Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ΅?
Π£ ΠΌΠ΅Π½Ρ Π±ΡΠ»Π° ΡΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, ΠΈ Π²ΡΠ΅ΡΠ° Π²Π΅ΡΠ΅ΡΠΎΠΌ Ρ Π½Π°ΡΠ΅Π» ΠΎΠ±Ρ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡΡΡ Π΄Π»Ρ ΡΠ²ΠΎΠ΅Π³ΠΎ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ Π²Π°ΡΠΈΠ°Π½ΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ.
ΠΠ»Ρ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° Ρ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ» ΡΠΏΠΈΡΠΎΠΊ DragSources, ΠΈ Π΅ΡΠ»ΠΈ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΈΠ· Π½ΠΈΡ Π±ΡΠ» ΠΏΠ΅ΡΠ΅ΡΠ°ΡΠ΅Π½ Π½Π° DropTarget, ΠΎΠ½ΠΈ Π±ΡΠ»ΠΈ Π±Ρ ΡΠ΄Π°Π»Π΅Π½Ρ ΠΈΠ· ΡΠΏΠΈΡΠΊΠ° DragSources, Π° DropTarget Π±ΡΠ» Π±Ρ Π·Π°ΠΌΠ΅Π½Π΅Π½ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ DragSource.
ΠΠ°ΠΆΠ½ΠΎΠΉ ΡΠ°ΡΡΡΡ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΠ΅ΡΠ΅ΡΠ°ΡΠΊΠΈΠ²Π°Π½ΠΈΡ (ΡΡΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π΄Π»Ρ ΡΠΎΠΏΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΡ Β«ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΉΒ» Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌΠΈ) Π±ΡΠ»Π° ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΠΎΠ±ΡΠ°ΡΠ½ΠΎ Π² ΡΠΏΠΈΡΠΎΠΊ DragSource, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΎΡΡΠΎ Π·Π°ΠΌΠ΅Π½ΡΠ»Π° ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½Π½ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π½Π° DragSource ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΠ»Π° Π΅Π³ΠΎ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ Π² DragSources. ΡΠΏΠΈΡΠΎΠΊ.
Π’Π΅ΠΏΠ΅ΡΡ ΡΡΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π»ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Ρ ΠΏΠΎΠΌΠ΅ΡΠ°Π» ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π²ΠΎ Π²ΡΠ΅ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΈ ΠΈ ΡΠ΄Π°Π»ΡΠ» Ρ
ΠΎΡΡ Π±Ρ ΠΎΠ΄Π½Ρ (Π° Π½Π΅ ΡΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΡΠΏΠΈΡΠΎΠΊ Π±ΡΠ» Π½Π΅ΠΏΠΎΠ»Π½ΡΠΌ, ΠΈ Ρ Π±Ρ ΡΠ΄Π°Π»ΠΈΠ» ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠ½ΠΎΠ²Π° Π΄ΠΎΠ±Π°Π²ΠΈΠ» Π΅Π³ΠΎ). ΠΡΠ°ΠΊ, Ρ ΠΏΡΠΈΡΠ΅Π» ΠΊ Π²ΡΠ²ΠΎΠ΄Ρ, ΡΡΠΎ ΡΠΏΠΈΡΠΎΠΊ 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.
ΠΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π±ΡΠ»Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½Π° ΠΊΠ°ΠΊ ΡΡΡΠ°ΡΠ΅Π²ΡΠ°Ρ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π² ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π΅ Π²ΡΠ΅ΠΌΡ Π½Π΅ Π±ΡΠ»ΠΎ Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ. ΠΠ½ Π±ΡΠ΄Π΅Ρ Π·Π°ΠΊΡΡΡ, Π΅ΡΠ»ΠΈ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ Π±ΡΠ΄Π΅Ρ Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ. Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° Π²Π°Ρ Π²ΠΊΠ»Π°Π΄.
Π‘Π°ΠΌΡΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ
Π£ ΠΌΠ΅Π½Ρ ΡΠΎΠΆΠ΅ Π΅ΡΡΡ ΡΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° - ΠΌΠΎΡ ΡΠΈΡΡΠ°ΡΠΈΡ ΡΠ°ΠΊΠΎΠ²Π°, ΡΡΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ React ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΈ ΡΠ΅Π»ΡΡ ΠΏΠ΅ΡΠ΅ΡΠ°ΡΠΊΠΈΠ²Π°Π½ΠΈΡ, ΠΈ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΎΠΌ ΠΏΠ΅ΡΠ΅ΡΠ°ΡΠΊΠΈΠ²Π°Π½ΠΈΡ. ΠΠΎΠ³Π΄Π° Ρ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ Π΄Π²Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°, Ρ ΠΌΠΎΠ³Ρ ΠΏΠ΅ΡΠ΅ΡΠ°ΡΠΈΡΡ ΠΈΡ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·, ΠΏΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ ΡΠΊΠ°Π·Π°Π½Π½Π°Ρ Π²ΡΡΠ΅ ΠΎΡΠΈΠ±ΠΊΠ°. ΠΠΎΠ³Π΄Π° Ρ ΠΌΠ΅Π½Ρ ΡΡΠΈ, ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π±Π΅Π· ΠΎΡΠΈΠ±ΠΎΠΊ. Π― ΠΏΠΎΠ»Π°Π³Π°Ρ, ΡΡΠΎ ΠΊΠ°ΠΊ-ΡΠΎ ΡΠ²ΡΠ·Π°Π½ΠΎ Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠΎΠ² Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ΅?