Drag and drop in React con React Beautiful DND

Utilizziamo react-beautiful-dnd per aggiungere funzionalità drag and drop nelle tue applicazioni React.

Drag and drop in React con React Beautiful DND

react-beautiful-dnd è una libreria creata da Atlassian per facilitare l'implementazione di funzionalità drag and drop in applicazioni React. Questa libreria offre un'esperienza utente fluida e accessibile, supportando scenari complessi come il riordinamento di liste. La sua facilità d'uso e le animazioni fluide la rendono una scelta eccellente per gli sviluppatori che desiderano migliorare l'interattività delle loro applicazioni.

Presumiamo che tu abbia già installato React e le librerie dipendenti necessarie nel tuo progetto.

Installazione

Terminal
// npm npm install react-beautiful-dnd // yarn yarn add react-beautiful-dnd

Se stai utilizzando TypeScript, assicurati di installare anche i tipi per react-beautiful-dnd:

JavaScript
// npm npm install @types/react-beautiful-dnd // yarn yarn add @types/react-beautiful-dnd

Una volta installata la libreria e le sue eventuali dipendenze, procediamo con una configurazione base importando i componenti principali

JavaScript
import { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd';

Il contesto di Drag and Drop (DragDropContext) è il componente principale che avvolge le aree droppable e gli elementi draggable. Esso gestisce gli eventi di trascinamento e rilasciamento.

JavaScript
<DragDropContext onDragEnd={() => console.log('attività completata')}> {/* Altri componenti */} </DragDropContext>

Una volta effettuato questo passaggio, procediamo con l'installazione di un area draggable.

Le aree droppable sono le zone in cui gli elementi draggable possono essere trascinati e rilasciati. Il componente Droppable gestisce il comportamento e l'aspetto di queste aree.

JavaScript
const DroppableArea = () => { return ( <Droppable droppableId="droppable-area"> {(provided) => ( <div {...provided.droppableProps} ref={provided.innerRef}> {/* Elementi Draggable */} {provided.placeholder} </div> )} </Droppable> ); };

Nell'esempio sopra, utilizziamo droppableId e provided, ma scopriamoli insieme!

  • droppableId è un identificatore unico per l'area droppable
  • provided contiene le proprietà e i riferimenti necessari per rendere l'area droppable funzionante

Effettuato questo passaggio, procediamo nell'inserire degli elementi draggable.

Gli elementi draggable sono gli elementi che possono essere trascinati all'interno delle aree droppable.

Il componente Draggable gestisce il comportamento e l'aspetto di questi elementi.

JavaScript
const DraggableItem = ({ item, index }) => { return ( <Draggable draggableId={item.id} index={index}> {(provided) => ( <div ref={provided.innerRef} {...provided.draggableProps} {...provided.dragHandleProps} > {item.content} </div> )} </Draggable> ); };

Ecco un esempio completo, di come la struttura del tuo componente, dovrebbe risultare:

JavaScript
import React, { useState } from 'react'; import { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd'; // Elementi iniziali const initialItems = [ { id: 'item-1', content: 'Item 1' }, { id: 'item-2', content: 'Item 2' }, { id: 'item-3', content: 'Item 3' }, ]; const App = () => { const [items, setItems] = useState(initialItems); // Funzione per gestire la fine del drag and drop const onDragEnd = (result) => { if (!result.destination) return; const newItems = Array.from(items); const [removed] = newItems.splice(result.source.index, 1); newItems.splice(result.destination.index, 0, removed); setItems(newItems); }; return ( <DragDropContext onDragEnd={onDragEnd}> <Droppable droppableId="droppable-area"> {(provided) => ( <div {...provided.droppableProps} ref={provided.innerRef} style={{ padding: '16px', width: '250px', backgroundColor: '#f0f0f0', }} > {items.map((item, index) => ( <Draggable key={item.id} draggableId={item.id} index={index}> {(provided, snapshot) => { return ( <div ref={provided.innerRef} {...provided.draggableProps} {...provided.dragHandleProps} style={{ userSelect: 'none', padding: '16px', margin: '0 0 8px 0', minHeight: '50px', backgroundColor: snapshot.isDragging ? '#e0e0e0' : '#fff', color: '#333', ...provided.draggableProps.style, }} > {item.content} </div> ); }} </Draggable> ))} {provided.placeholder} </div> )} </Droppable> </DragDropContext> ); }; export default App;

Questa libreria offre diverse funzionalità avanzate per scenari complessi:

  • Gestione delle Liste Annidate: supporta il drag and drop all'interno di liste annidate
  • Animazioni Fluide: le animazioni integrate migliorano l'esperienza utente
  • Accessibilità: supporta l'accessibilità per gli utenti che utilizzano la tastiera o screen reader
  • Callback Completi: utilizza callback come onDragStart, onDragUpdate, e onDragEnd per personalizzare il comportamento del drag and drop

react-beautiful-dnd è una libreria potente e facile da usare per aggiungere funzionalità drag and drop alle applicazioni React. Con la sua vasta gamma di funzionalità e il supporto per scenari complessi, è una scelta eccellente per migliorare l'interattività e l'esperienza utente delle tue applicazioni.

Provala nella tua prossima applicazione e sperimenta le sue potenzialità!