์ด๋ฒ์ ๋๋๊ทธ ์ค ๋๋์ ๊ตฌํํด์ผํ์ต๋๋ค. ์ด์ ์๋ ๊ตฌํํ๋ ์ ์ด ์์๋๋ฐ, ๊ทธ๊ฑด ์ด๋ฏธ ๋๊ตฐ๊ฐ ์ ์ด๋ ์ฝ๋๋ฅผ ์นดํผ ์ค ํ์ด์คํธ ํ๋์ง๋ผ๐ (์์ฌ๊ณ ๋ฐฑ). ์ฒ์๋ถํฑ ์ ์ฉํ๊ฒ ๋๋ ์ด๋ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ธ๊น, ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ธ ํ์๊ฐ ์์๊น? ๋ฑ์ ๊ณ ๋ฏผ์ ํ๊ฒ ๋์์ต๋๋ค.
๋๋ฃ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐ์ง ์๊ณ ๊ตฌํํ๋ ค๊ณ ํ๋๋ฐ, ๋ค์ ์๊ฐํด๋ณด๋ ์ฝ๋๊ฐ ๋๋ฌด ๋ณต์กํด์ ธ์ ์ฐ๋๊ฒ ์ข์ ๊ฒ ๊ฐ๋ค๊ณ ๋ฆฌ์์น๋ฅผ ๋ถํํ๊ณ , ์ ๋ ๋ ๊ฐ์ง์ ์ต์ ์ ์ฐพ์์ต๋๋ค.
- react-dnd
- react-beautiful-dnd
๋ ๊ฐ์ง๋ฅผ ๋น๊ตํ์ ๋, beautiful-dnd๊ฐ ํ์ ํ ๋ง์ด ์ฌ์ฉ๋๊ณ , ๊ทธ ๋งํผ ์ด์๋ ๋ง๊ธดํ์ต๋๋ค. ใ
์์ ๋์ ์ธ ๋ฉด์ ๋น๊ตํ์ ๋๋ react-dnd๊ฐ ํ์คํ ๋ ๋์๋ณด์์ง๋ง, ์ ๋ ์นธ๋ฐ์ ๋ง๋๋ ๊ฒ๋ ์๋๊ณ vertical๋ก ๋๋๊ทธ ์ค ๋๋กญ ๊ธฐ๋ฅ๋ง ๊ตฌํ์ด ๋๋ฉด ๋๋ ๊ฑฐ์๊ธฐ ๋๋ฌธ์ ์์ฐ์ค๋ฌ์ด ์ ๋๋ฉ์ด์ ๊น์ง ๊ตฌํํด์ฃผ๋ react-beautiful-dnd๋ฅผ ์ ํํ์ต๋๋ค.
์ ๊ฐ ์ฐธ๊ณ ํ demo code์ ๋๋ค!
์ ๊ฐ ๊ตฌํํด์ผํ๋ ๋๋๊ทธ์ค ๋๋์ ์๋์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์์ต๋๋ค.
- ํ๋์ ๋ฆฌ์คํธ ์์ ์์ด๋ฉด ์๋๋ drag&drop ๊ทธ๋ฃน์ด 2๊ฐ ์๊ณ ,
- ๋น ์นธ๋ ๋จ๊ฒจ์ ธ์์ด์ ๊ทธ ๊ณณ์ drag&drop์ด ๋๋ฉด ์๋๋ ์ํฉ!
- 1๋ฒ ๋๋๊ทธ ๊ทธ๋ฃน๊ณผ 2๋ฒ ๋๋๊ทธ ๊ทธ๋ฃน์ ์์ด๋ฉด ์๋ฉ๋๋ค.
๋คํ์ด๋ ๋ฐ์ดํฐ๊ฐ ์์ผ ์ผ์ด ์๊ธฐ๋๋ฌธ์ 1๋ฒ ๊ทธ๋ฃน ๋ฐ์ดํฐ๋ฅผ ๋ฌถ๊ณ 2๋ฒ ๊ทธ๋ฃน ๋ฐ์ดํฐ๋ฅผ ๋ฌถ์ด์ ๋ฐ๋ก ๋๋๊ทธ ์ค ๋๋ฃน์ ๋ง๋ค์ด ์ค๋๋ค.
๊ทธ๋ฆฌ๊ณ ํ๋ฉด์๋ ์ด 5๊ฐ์ ์ฌ๋กฏ์ด ๋ณด์ฌ์ผํ๊ธฐ ๋๋ฌธ์ ๋ ๊ทธ๋ฃน์ ๊ฐ์ผ ์ปดํฌ๋ํธ ์๋์ 5์์ ๋ ๊ทธ๋ฃน์ด ๋ํด์ง ๊ธธ์ด๋ฅผ ๋บ ๋๋จธ์ง๋ฅผ ๋น ์นธ์ผ๋ก ๋ง๋ค์ด์ ํํํด์ค๋๋ค.
์ด ๋ค์๋ถํฐ๋ ์ฝ์ต๋๋ค. ๋๋๊ทธ ์ค ๋๋๋ง ์ ์ฉ์์ผ์ฃผ๋ฉด ๋๊ธฐ๋๋ฌธ์ด์ฃ !
const handleDragItem = (result: any) => {
try {
if (!result.destination) {
return;
}
const items = [...outerData];
const reorederItems = items.splice(result.source.index, 1)[0];
items.splice(result.destination.index, 0, reorederItems);
// redux์ ์์ดํ
update ์์ผ์ค๋๋ค
dispatch(
changeSelectItemsIndex({
from: result.source.index,
to: result.destination.index,
isOuter: true,
}),
);
} catch (err) {
console.error(err);
}
};
<DragDropContext onDragEnd={handleDragItem}>
<Droppable droppableId="listOuter" direction="vertical">
{(provided) => (
<div
className="listOuter"
{...provided.droppableProps}
ref={provided.innerRef}
>
{data.map((item: ProductItemsDTO, idx) => {
return (
<Draggable
key={`${item.id}`}
draggableId={`${item.id}`}
index={idx}
>
{(provided) => (
<div
key={item.id}
ref={provided.innerRef}
{...provided.draggableProps}
{...provided.dragHandleProps}
>
<List className="draggable" key={item.id}>
<StyledPadding>
<StyledDragContainer $active={item.id === index}>
<StyledThumImg
src={item.productColors[0].mainImageUrl}
onClick={() => clickProd(item)}
/>
</StyledDragContainer>
</StyledPadding>
</List>
</div>
)}
</Draggable>
);
})}
{provided.placeholder}
</div>
)}
</Droppable>
</DragDropContext>
โจ React Beautiful dnd
https://www.npmjs.com/package/react-beautiful-dnd