π Drag-and-Drop Π² React: ΠΏΡΠΎΡΡΠΎΠ΅ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ
Π€ΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»
drag-and-drop ΡΠ°ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΈ Π΄ΡΡΠ³ΠΈΡ
ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΡΡ
Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ. Π‘Π΅Π³ΠΎΠ΄Π½Ρ ΡΠ°Π·Π±Π΅ΡΡΠΌ, ΠΊΠ°ΠΊ Π΅Π³ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Π² React Ρ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΌΠΈ ΡΡΠΈΠ»ΠΈΡΠΌΠΈ!
πΉ ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΡΠ°Π³ΠΈ Π΄Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ
1.
ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠΎΠ±ΡΡΠΈΠΉ ΠΏΠ΅ΡΠ΅ΡΠ°ΡΠΊΠΈΠ²Π°Π½ΠΈΡ
Π HTML5 Π΅ΡΡΡ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠ΅ ΡΠΎΠ±ΡΡΠΈΡ Π΄Π»Ρ drag-and-drop:
-
onDragStart
β ΠΈΠ½ΠΈΡΠΈΠΈΡΡΠ΅Ρ ΠΏΠ΅ΡΠ΅ΡΠ°ΡΠΊΠΈΠ²Π°Π½ΠΈΠ΅.
-
onDragOver
β ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π±ΡΡΡ Π·ΠΎΠ½ΠΎΠΉ Π΄Π»Ρ ΡΠ±ΡΠΎΡΠ°.
-
onDrop
β ΡΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΠΏΡΠΈ ΠΎΡΠΏΡΡΠΊΠ°Π½ΠΈΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°.
2.
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°
ΠΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ, Π³Π΄Π΅ ΠΌΡ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅ΡΠ°ΡΠΊΠΈΠ²Π°Π½ΠΈΡ ΠΈ ΠΎΠ±Π»Π°ΡΡΡ Π΄Π»Ρ ΡΠ±ΡΠΎΡΠ°.
import React, { useState } from 'react';
const DragAndDrop = () => {
const [droppedItem, setDroppedItem] = useState('');
const handleDragStart = (e, data) => {
e.dataTransfer.setData('text/plain', data);
};
const handleDrop = (e) => {
e.preventDefault();
const data = e.dataTransfer.getData('text/plain');
setDroppedItem(data);
};
const handleDragOver = (e) => {
e.preventDefault();
};
return (
<div>
<div
draggable
onDragStart={(e) => handleDragStart(e, 'ΠΠ΅ΡΠ΅ΡΠ°ΡΠ΅Π½ΠΎ!')}
style={{ width: '150px', padding: '10px', backgroundColor: '#f0f0f0', cursor: 'grab', marginBottom: '20px' }}
>
ΠΠ΅ΡΠ΅ΡΠ°ΡΠΈ ΠΌΠ΅Π½Ρ!
</div>
<div
onDrop={handleDrop}
onDragOver={handleDragOver}
style={{ width: '200px', height: '100px', backgroundColor: '#e0e0e0' }}
>
ΠΡΠΎΡΡ ΡΡΠ΄Π°!
</div>
{droppedItem && <p>Π Π΅Π·ΡΠ»ΡΡΠ°Ρ: {droppedItem}</p>}
</div>
);
};
export default DragAndDrop;
πΉ ΠΠ±ΡΡΡΠ½Π΅Π½ΠΈΠ΅
1.
`draggable`
Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΊΠ°ΠΊ "ΠΏΠ΅ΡΠ΅ΡΠ°ΡΠΊΠΈΠ²Π°Π΅ΠΌΡΠΉ".
2.
`dataTransfer`
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ Π΄Π°Π½Π½ΡΡ
ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΎΠ±ΡΡΠΈΡΠΌΠΈ
onDragStart
ΠΈ
onDrop
.
3.
`onDragOver`
ΠΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°Π΅Ρ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡΡ ΡΠ±ΡΠΎΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°.
4.
Π‘ΡΠΈΠ»ΠΈΠ·Π°ΡΠΈΡ
ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π²ΠΈΠ·ΡΠ°Π»ΡΠ½ΡΠ΅ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠΈ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π±ΡΠ»ΠΎ ΠΏΠΎΠ½ΡΡΠ½ΠΎ, Π³Π΄Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ±ΡΠ°ΡΡΠ²Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ.
πΉ ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ `react-dnd`
ΠΠ»Ρ Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡΡ
ΡΡΠ΅Π½Π°ΡΠΈΠ΅Π², ΡΠ°ΠΊΠΈΡ
ΠΊΠ°ΠΊ ΠΏΠ΅ΡΠ΅ΡΠ°ΡΠΊΠΈΠ²Π°Π½ΠΈΠ΅ ΡΠΏΠΈΡΠΊΠΎΠ² ΠΈΠ»ΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌΠΈ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ
react-dnd.
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ°:
npm install react-dnd react-dnd-html5-backend
ΠΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ:
import React from 'react';
import { DndProvider, useDrag, useDrop } from 'react-dnd';
import { HTML5Backend } from 'react-dnd-html5-backend';
const ItemType = 'BOX';
const DraggableItem = ({ id }) => {
const [, dragRef] = useDrag(() => ({
type: ItemType,
item: { id },
}));
return (
<div ref={dragRef} style={{ padding: '10px', backgroundColor: '#f0f0f0', marginBottom: '10px', cursor: 'grab' }}>
ΠΠ»Π΅ΠΌΠ΅Π½Ρ {id}
</div>
);
};
const DropZone = ({ onDrop }) => {
const [, dropRef] = useDrop(() => ({
accept: ItemType,
drop: (item) => onDrop(item.id),
}));
return (
<div
ref={dropRef}
style={{ width: '200px', height: '100px', backgroundColor: '#e0e0e0' }}
>
ΠΡΠΎΡΡ ΡΡΠ΄Π°!
</div>
);
};
const DragAndDropExample = () => {
const handleDrop = (id) => {
alert(`ΠΡ ΠΏΠ΅ΡΠ΅ΡΠ°ΡΠΈΠ»ΠΈ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ${id}`);
};
return (
<DndProvider backend={HTML5Backend}>
<DraggableItem id={1} />
<DraggableItem id={2} />
<DropZone onDrop={handleDrop} />
</DndProvider>
);
};
export default DragAndDropExample;
πΉ ΠΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ `react-dnd`
- Π£Π΄ΠΎΠ±Π½Π°Ρ ΡΠ°Π±ΠΎΡΠ° Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ².
- ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΡΠ»ΠΎΠΆΠ½ΡΡ
ΡΡΠ΅Π½Π°ΡΠΈΠ΅Π² (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠ΅ΡΠ΅ΡΠ°ΡΠΊΠΈΠ²Π°Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΏΠΈΡΠΊΠ°ΠΌΠΈ).
- Π Π°ΡΡΠΈΡΠ΅Π½Π½ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΊΠ°ΡΡΠΎΠΌΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ.
π― ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
React ΡΠΏΡΠΎΡΠ°Π΅Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ drag-and-drop Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ ΡΠΎΠ±ΡΡΠΈΡΠΌ HTML5, Π° Π΄Π»Ρ ΡΠ»ΠΎΠΆΠ½ΡΡ
Π·Π°Π΄Π°Ρ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠΎΡΠ½ΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π²ΡΠΎΠ΄Π΅
react-dnd
ReactJs Daily | #begginers