<Draggable /> > draggableId
and<Droppable /> > droppableId
A <Draggable />
and a <Droppable />
have an id. These are draggableId
and droppableId
respectively.
We expect an id to be a string
type Id = string;
type DroppableId = Id;
type DraggableId = Id;
More information: types guide
A id must uniquely identify a <Draggable />
or <Droppable />
within a <DragDropContext />
. So if you have multiple connected lists, each <Droppable />
needs to have a unique id and each <Draggable />
needs to have a unique id, even if the item is in a different list.
The id must also be unique even if the type
argument on the <Droppable />
is different.
Right now it is important that all Id
's be strings. rfd
will throw an error if an Id
is not a string.
For simplicity, it is best to avoid changing a draggableId
or droppableId
when a reorder occurs. The safest option is to associate an id with a piece of data and do not update the id between reorders.
You can change the draggableId
or droppableId
at any time except during a drag. Including after reorder. However, to avoid an exception you need to avoid reusing id's between two components. This can happen if you base a draggableId or droppableId on an index.
Don't base an id on a index
old droppableId: "droppable-0" new droppableId: "droppable-1"
👉 delete reference to "droppable-0" 👉 add reference to "droppable-1"
old droppableId: "droppable-1" 😢 new droppableId: "droppable-2"
👉 delete reference to "droppable-1" 😢 (will remove reference to our new "droppable-1") 👉 add a reference to "droppable-2"
old droppableId: "droppable-1" 💥 new droppableId: "droppable-5"
👉 delete reference to "droppable-1" 💥 (will cause an exception because "droppable-1" is not found)
Yep!
But we do things this way for simplicity and performance. Feel free to continue this conversation in a Github issue if you feel strongly about it.