๋ฒ๊ทธ ์ค๋ช
html5backend์ ์ฌ๊ฐํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋๋๊ทธํ ์์๋ฅผ ๋๋กญํ ์์น๋ฅผ ์ฌ์ฉ์์๊ฒ ์๋ดํ๊ธฐ ์ํด ์ฝ๊ฐ์ ๊ฐ๊ฒฉ์ ์์ฑํด์ผ ํฉ๋๋ค. ์ด๋ฌํ ๊ฐ๊ฒฉ์ ์์๊ฐ ๋๋๊ทธ๋๋ ๋์์๋ง ํ์๋๊ธฐ๋ฅผ ์ํฉ๋๋ค.
ํ์ด์ด ํญ์ค์์๋ ์๋ฒฝํ๊ฒ ์๋ํ์ง๋ง ํฌ๋กฌ์์๋ ์นด๋๊ฐ ๋๋๊ทธ ์์ ์ด๋ฒคํธ ์งํ์ ๋๋๊ทธ ์ค์ง ์ด๋ฒคํธ๋ฅผ ์์ํฉ๋๋ค.
์์
https://codesandbox.io/s/react-dnd-sortable-holes-bq2oe
๊ฐ ์นด๋๋ ๋ ์ ์์ผ๋ฉฐ ์ฌ์ฉ์๊ฐ ๋๊ธฐ ์์ํ๋ฉด ์ฃผํฉ์ ๊ฐ๊ฒฉ์ด ๋ํ๋ฉ๋๋ค.
ํ์ด์ด ํญ์ค์์๋ ๋งค๋ ฅ์ฒ๋ผ ์๋ํ์ง๋ง ํฌ๋กฌ์์๋ ์์ ์ด๋ฒคํธ ์งํ์ ์ค์ง ์ด๋ฒคํธ๊ฐ ์์๋ฉ๋๋ค.
์ฝ์์์ ๋ณผ ์ ์๋ฏ์ด :
๋์์ ์ฃผ์๋ฉด ์ ๋ง ๊ฐ์ฌํ๊ฒ ์ต๋๋ค. ์ด ๊ธฐ๋ฅ์ด ์ ๋ง ํ์ํฉ๋๋ค.
์ด ๋ฌธ์ ์ ๋ํด ๋ง์ ๋
์๋ฅผ ํตํด ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฐพ์์ต๋๋ค. ๊ตฌ์ฑ ์์๋ฅผ ํตํด ์ ๋ฌํ๋ ์๊ฐ ์ ํ ๋ฐ ์ํ ๋ณ์๋ฅผ ์ค์ ํฉ๋๋ค. ์ด ๊ฐ๋จํ ๊ฒฝ์ฐ์๋ ํ๊ธฐ ์ฝ์ง๋ง ๋ณต์กํ๊ธฐ ๋๋ฌธ์ ๊ทธ๋ค์ง ์ข์ํ์ง ์์ต๋๋ค. ๋ชจ๋ ๊ฒ์ด ์๋ํ๋๋ก ์ปจํ
์คํธ ๋๋ ์ด์ ์ ์ฌํ ๊ฒ์ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ.
https://codesandbox.io/s/react-dnd-sortable-holes-vxeus
๋ ๋์ ์๋ฃจ์ ์ ์๋ดํด ์ฃผ์ จ์ผ๋ฉด ํฉ๋๋ค. ์ด ํด๊ฒฐ ๋ฐฉ๋ฒ ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ isDragging์ ์ฌ์ฉํ๊ณ ์ถ์ต๋๋ค.
์ฐ๋ฆฌ ํ์ ๋๋๊ทธ ์ค ๋๋กญ ๊ณต๊ธ์๋ฅผ ์ํ ์ฌ์ฉ์ ์ง์ ํํฌ๋ฅผ ๋ง๋๋ ์ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๊ฐ์ ํ์ต๋๋ค. ์ด ๋ฌธ์ ์ ์ง๋ฉดํ ์ฌ๋์ด ์์ ๊ฒฝ์ฐ ์ฌ๊ธฐ์ ๋ฒ๊ทธ๊ฐ ํด๊ฒฐ๋๋ ๋์ ์๋ฃจ์ ์ด ์์ต๋๋ค.
https://codesandbox.io/s/react-dnd-sortable-gaps-custom-9tl13
์ฃผ์ ๋ถ๋ถ์ ๋๋๊ทธ ์ํ๋ฅผ ์ ์ฅํ ์ปจํ ์คํธ์ ๊ณต๊ธ์๋ฅผ ์ ์ํ๋ ๊ฒ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
const DndContext = React.createContext([{}, () => {}]);
const DndCustomProvider = props => {
const [state, setState] = useState({ dragging: false });
return (
<DndProvider backend={props.backend}>
<DndContext.Provider value={[state, setState]}>
{props.children}
</DndContext.Provider>
</DndProvider>
);
};
๋์งธ, ๋๊ธฐ ์์ ๊ธฐ๋ฅ์์ setTimeout์ ์ฌ์ฉํ๋ฉด ๋์ด ๋์คํจ์น๋๋ ๊ฒ์ ํผํ ์ ์์ต๋๋ค.
const [context, setContext] = useContext(DndContext);
const [collected, dragRef] = useDrag({
...,
begin: monitor => {
setTimeout(() => {
setContext(() => ({ dragging: true }));
}, 0);
if (begin) {
begin(monitor);
}
},
end: (item, monitor) => {
setContext(() => ({ dragging: false }));
if (end) {
end(item, monitor);
}
},
...
});
return [
{
...collected,
isDragging: context.dragging
},
dragRef
];
๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ผ๋ก isDragging ์์ง๋ ๊ฐ์ ์ปจํ ์คํธ ๊ฐ์ผ๋ก ๋ฎ์ด์๋๋ค.
์ด๋ฌํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ํฌํจ๋์ง ์์ ์ด ๋ฌธ์ ์ ๋ํ ํจ์น์ ๋ํ ์๋ฃจ์ ์ด๋ ์์ด๋์ด๊ฐ ์๋ ์ฌ๋์ด ์์ต๋๊น?
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ฐ๋ฆฌ ํ์ ๋๋๊ทธ ์ค ๋๋กญ ๊ณต๊ธ์๋ฅผ ์ํ ์ฌ์ฉ์ ์ง์ ํํฌ๋ฅผ ๋ง๋๋ ์ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๊ฐ์ ํ์ต๋๋ค. ์ด ๋ฌธ์ ์ ์ง๋ฉดํ ์ฌ๋์ด ์์ ๊ฒฝ์ฐ ์ฌ๊ธฐ์ ๋ฒ๊ทธ๊ฐ ํด๊ฒฐ๋๋ ๋์ ์๋ฃจ์ ์ด ์์ต๋๋ค.
https://codesandbox.io/s/react-dnd-sortable-gaps-custom-9tl13
์ฃผ์ ๋ถ๋ถ์ ๋๋๊ทธ ์ํ๋ฅผ ์ ์ฅํ ์ปจํ ์คํธ์ ๊ณต๊ธ์๋ฅผ ์ ์ํ๋ ๊ฒ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
๋์งธ, ๋๊ธฐ ์์ ๊ธฐ๋ฅ์์ setTimeout์ ์ฌ์ฉํ๋ฉด ๋์ด ๋์คํจ์น๋๋ ๊ฒ์ ํผํ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ผ๋ก isDragging ์์ง๋ ๊ฐ์ ์ปจํ ์คํธ ๊ฐ์ผ๋ก ๋ฎ์ด์๋๋ค.