React中的拖拽功用完成:介绍react-beautiful-dnd及其运用进程
导言
在运用React构建Web运用程序时,拖拽功用是一项常见需求。为了方便完成拖拽功用,咱们能够借助第三方库react-beautiful-dnd
。本文将介绍react-beautiful-dnd
的基本概念,并结合实践的项目代码一步步具体介绍其运用进程。
什么是react-beautiful-dnd
react-beautiful-dnd
是一个用于完成强壮而灵敏的拖拽功用的React库。它的规划思路是将拖拽功用分解为三个关键组件:DragDropContext
、Droppable
和Draggable
。
1. DragDropContext(拖拽上下文)
DragDropContext
是react-beautiful-dnd
的核心组件之一,用于包裹整个拖拽区域。它负责管理拖拽的状况和交互,并经过事情处理函数将拖拽的成果传递给其他组件。
import { DragDropContext } from 'react-beautiful-dnd';
<DragDropContext onDragEnd={onDragEnd}>
{/* ... */}
</DragDropContext>
在上面的代码中,DragDropContext
组件经过onDragEnd
特点指定了拖拽结束时的事情处理函数。
2. Droppable(可放置区域)
Droppable
表明一个能够放置拖拽元素的区域。经过在Droppable
组件上设置droppableId
特点来仅有标识该区域。Droppable
组件会将拖拽元素放置在其内部,并供给一些特点和回调函数供自界说。
import { Droppable } from 'react-beautiful-dnd';
<Droppable droppableId="sortable-list">
{(provided) => (
<ul
className="sortable-list"
{...provided.droppableProps}
ref={provided.innerRef}
>
{/* ... */}
</ul>
)}
</Droppable>
在上面的代码中,咱们创建了一个Droppable
组件,经过droppableId
特点指定了可放置区域的标识符。在回来的回调函数中,咱们能够运用provided.droppableProps
和provided.innerRef
特点来供给给Droppable
组件的容器元素。
3. Draggable(可拖拽元素)
Draggable
表明一个可拖拽的元素。经过设置draggableId
特点和index
特点来仅有标识和排序拖拽元素。Draggable
组件包裹在Droppable
组件内部,根据用户的操作进行方位变化,并供给一些特点和回调函数供自界说。
import { Draggable } from 'react-beautiful-dnd';
const renderPageForm = (item, index) => {
const id = index;
return (
<Draggable key={id} draggableId={String(index + 1)} index={index}>
{(provided) => (
<li
className="drag-wrap"
{...provided.draggableProps}
ref={provided.innerRef}
>
{/* ... */}
</li>
)}
</Draggable>
);
};
在上面的代码中,咱们运用Draggable
组件包裹了每个可拖拽元素。经过draggableId
特点和index
特点来仅有标识和排序元素。在回来的回调函数中,咱们能够运用provided.draggableProps
和provided.innerRef
特点来供给给Draggable
组件的元素。
实践运用
下面咱们将结合实践的代码来一一具体介绍如何运用react-beautiful-dnd
来完成拖拽功用。
import { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd';
// DragDropContext包裹拖拽区域
<DragDropContext onDragEnd={onDragEnd}>
{/* Droppable组件表明可放置区域 */}
<Droppable droppableId="sortable-list">
{(provided) => (
<ul
className="sortable-list"
{...provided.droppableProps}
ref={provided.innerRef}
>
{pageList.map(renderPageForm)}
{provided.placeholder}
</ul>
)}
</Droppable>
</DragDropContext>
在上面的代码中,咱们经过DragDropContext
组件将整个拖拽区域进行包裹,并设置了onDragEnd
事情处理函数来处理拖拽成果。在DragDropContext
组件内部,咱们运用Droppable
组件来表明一个可放置区域,经过droppableId
特点进行仅有标识。在回来Droppable
组件的回调函数中,咱们构建了一个ul
元素,经过provided.droppableProps
和provided.innerRef
特点来供给给Droppable
组件的容器元素。
const renderPageForm = (item, index) => {
const id = index;
return (
<Draggable key={id} draggableId={String(index + 1)} index={index}>
{(provided) => (
<li
className="drag-wrap"
{...provided.draggableProps}
ref={provided.innerRef}
>
{/* ... */}
</li>
)}
</Draggable>
);
};
在上面的代码中,咱们界说了一个函数renderPageForm
,用于烘托单个可拖拽元素。在该函数中,咱们运用Draggable
组件来包裹每个可拖拽元素,并经过draggableId
特点和index
特点来仅有标识和排序元素。在回来Draggable
组件的回调函数中,咱们构建了一个li
元素,经过provided.draggableProps
和provided.innerRef
特点来供给给Draggable
组件的元素。