Muscardinus
Drag and Drop 라이브러리 본문
728x90
SortableList.jsx
import React, { useState, useCallback } from "react";
import "./SortableList.css";
import SortableListItem from "./SortableListItem";
function SortableList({ data, onDropItem, onClickItem, renderItem }) {
const [startIndex, setStartIndex] = useState(0);
const [listData, setListData] = useState(data);
const onDragStart = (index) => setStartIndex(index);
const onDrop = useCallback(
(dropIndex) => {
const dragItem = listData[startIndex];
const list = [...listData];
list.splice(startIndex, 1);
const newListData =
startIndex < dropIndex
? [
...list.slice(0, dropIndex - 1),
dragItem,
...list.slice(dropIndex - 1, list.length),
]
: [
...list.slice(0, dropIndex),
dragItem,
...list.slice(dropIndex, list.length),
];
setListData(newListData);
onDropItem(newListData);
},
[startIndex, onDropItem, listData]
);
return (
<ul className="sortable-list">
{listData.map((item, index) => (
<SortableListItem
key={index}
index={index}
draggable
onDropItem={onDrop}
onDragStart={onDragStart}
onClickItem={onClickItem}
>
{renderItem(item, index)}
</SortableListItem>
))}
<SortableListItem
key={listData.length}
index={listData.length}
draggable={false}
onDropItem={onDrop}
onDragStart={0}
onClickItem={onClickItem}
/>
</ul>
);
}
export default SortableList;
SortableListItem.jsx
import React, { useState, useCallback } from "react";
import "./SortableList.css";
import SortableListItem from "./SortableListItem";
function SortableList({ data, onDropItem, onClickItem, renderItem }) {
const [startIndex, setStartIndex] = useState(0);
const [listData, setListData] = useState(data);
const onDragStart = (index) => setStartIndex(index);
const onDrop = useCallback(
(dropIndex) => {
const dragItem = listData[startIndex];
const list = [...listData];
list.splice(startIndex, 1);
const newListData =
startIndex < dropIndex
? [
...list.slice(0, dropIndex - 1),
dragItem,
...list.slice(dropIndex - 1, list.length),
]
: [
...list.slice(0, dropIndex),
dragItem,
...list.slice(dropIndex, list.length),
];
setListData(newListData);
onDropItem(newListData);
},
[startIndex, onDropItem, listData]
);
return (
<ul className="sortable-list">
{listData.map((item, index) => (
<SortableListItem
key={index}
index={index}
draggable
onDropItem={onDrop}
onDragStart={onDragStart}
onClickItem={onClickItem}
>
{renderItem(item, index)}
</SortableListItem>
))}
<SortableListItem
key={listData.length}
index={listData.length}
draggable={false}
onDropItem={onDrop}
onDragStart={0}
onClickItem={onClickItem}
/>
</ul>
);
}
export default SortableList;
728x90
'FrontEnd > Basic Skills' 카테고리의 다른 글
React Router 간단 구현 (0) | 2022.07.03 |
---|---|
Checkbox (0) | 2022.03.21 |
Instant Search (0) | 2022.03.21 |
Tabs (0) | 2022.03.21 |
Carousel (0) | 2022.03.20 |
Comments