Создаём drag-and-drop элементы на React
В этой статье рассмотрим создание drag-and-drop элементов на React с помощью библиотеки react-beautiful-dnd от Atlassian.
56К открытий58К показов
В этой статье рассмотрим создание drag-and-drop элементов на React с помощью библиотеки react-beautiful-dnd от Atlassian. Статья рассчитана на людей, знакомых с React.
Вы научитесь создавать drag-and-drop элементы на React и сможете создать игру, наподобие такой:
Основные концепции
DragDropContext: место (поле), где фактически осуществляется drag-and-drop. Этот компонент вызывает onDragEnd
после того, как перетаскиваемый объект был отпущен. Также можно определить onDragStart
и onDragUpdate
для вызова после начала перетаскивания и по какому-нибудь событию во время перетаскивания соответственно.
Droppable: компонент, откуда и куда перетаскивается элемент. Этому компоненту нужны несколько свойств, которые будут описаны далее.
Draggable: элемент, который будет перемещаться. Как и droppable, ему нужны некоторые свойства, чтобы сделать компонент перемещаемым.
Создание игры
Определим начальные настройки, которые нужны для создания игры:
Теперь можно перейти к созданию первого компонента. Он будет содержать только один метод render
. Собственно, вот он:
NumbersGameContext
: это просто обёртка для DragDropContext
.VerticalColumn
: это столбец, содержащий перетаскиваемые элементы.
Droppable
DroppableWrapper
— это компонент, который реализует droppable-контейнер. У него есть необходимые свойства, которые определяются так:
Здесь нужен droppableId
, который должен быть уникальным в рамках DragDropContext
. Он также ожидает функцию в качестве дочернего элемента и использует паттерн render props, который позволяет избежать внешнего вмешательства в DOM.
Первый аргумент этой функции — provided
. У этого аргумента есть droppableProps
и они важны для определения компонента как droppable. Здесь можно применить некоторые или все из возможных свойств с помощью spread-синтаксиса. Для более подробной информации можно посмотреть документацию.
Второе свойство — это innerRef
, функция, которая передаёт необходимый DOM-элемент библиотеке.
Последнее свойство — placeholder
. Этот элемент при необходимости используется для увеличения пространства в droppable-области во время перетаскивания. Placeholder
нужно сделать дочерним элементом droppable-компонента. На этом этапе настройка компонента закончена.
Draggable
Теперь можно перейти к написанию DraggableListItems
. Этот компонент создаёт NumberBox
(перетаскиваемые объекты).
NumberBox
определяет обёртку для draggable:
DraggableItemWrapper
реализует draggable, потому что как и в случае droppable у него есть нужные свойства.
В этом коде реализуется уже упомянутый выше паттерн render props. В данном случае у draggable есть два свойства: draggableId
и index
. DraggableId
должен быть уникален в рамках DragDropContext
. Он также принимает функцию как дочерний элемент. Первый аргумент функции — provided
(как и в droppable). Второй аргумент — dragHandleProps
. Это свойство определяет компонент как draggable.
Теперь вы можете использовать DraggableItemWrapper
и забыть про низкоуровневые свойства.
onDragEnd
Вот что уже реализовано:
NumberGameContext
: реализацияDragDropContext
.DroppableWrapper
: реализация droppable.DraggableItemWrapper
: реализация draggable.
А вот те компоненты, которые являются частью игры:
VerticalColumn
: компонент, который инкапсулирует droppable-столбцы и draggable-элементы.DraggableListItems
: компонент, инкапсулирующий все NumberBox-элементы.NumberBox
: собственно, переносимый элемент.
Но пока onDragEnd
остаётся пустым. Исправим это.
Первым делом пройдёмся по аргументам метода:
Аргумент содержит данные об элементе, который перетаскивают (из какого столбца и позиции) и о месте, куда перетаскивают элемент (в какой столбец и позицию), а также какое действие сейчас происходит: «drag» или «drop».
Первым делом сохраним destination
, draggableId
и source
в переменные:
const { destination, source, draggableId } = result;
Теперь создадим новый список отсортированных элементов:
И обновим состояние:
И изюминка игры: как только пользователь перетаскивает элемент или же выигрывает, то воспроизводится соответствующая мелодия из папки assets
:
Вот так выглядит весь метод:
Заключение
Тех компонентов, которые были описаны выше, хватит для создание группы элементов с возможностью их перетаскивания в рамках одного столбца. Если в игру добавить CSS и дополнительные звуки, то это сделает её более приятной.
Ресурсы
56К открытий58К показов