react
리액트 todo에서 만든 drag and drop
deadeye
2023. 3. 31. 14:03
만든것
** 윈도우녹화로해서 저렇지 실제로 드래그 해서 옮긴거임....
HTML에 있는 onDragOver, onDrop onDragStart를 이용해서 구현했다.
메인 App.jsx에는
const handleDragStart = (e, list, index) => {
const dragInfo = { list, index }
e.dataTransfer.setData('text/plain', JSON.stringify(dragInfo))
dragInfo.draggedList = list // draggedList 설정
}
const handleDrop = (e, list) => {
e.preventDefault()
const dropInfo = JSON.parse(e.dataTransfer.getData('text/plain'))
// const { list: draggedList, index: draggedIndex } = dropInfo
const draggedList = dropInfo.list
const draggedIndex = dropInfo.index
if (list === draggedList) return
const newList = [...list]
const draggedItem = draggedList[draggedIndex]
newList.splice(draggedIndex, 0, draggedItem)
console.log(draggedList)
// draggedList.splice(draggedIndex, 1)
const updatedList = draggedList.slice()
updatedList.splice(draggedIndex, 1)
console.log(draggedList, doList, list)
// 상태 업데이트
// 아래 list === doList부분은 JSON.stringify가 없어도 잘비교됨
// 근데.. 위에는 있어야됨 why...??
if (JSON.stringify(draggedList) === JSON.stringify(doList))
setDoList([...updatedList])
if (JSON.stringify(draggedList) === JSON.stringify(DoingList))
setDoingList([...updatedList])
if (JSON.stringify(draggedList) === JSON.stringify(DoneList))
setDoneList([...updatedList])
if (list === doList) setDoList([...newList])
if (list === DoingList) setDoingList([...newList])
if (list === DoneList) setDoneList([...newList])
}
const handleDragOver = (e) => {
e.preventDefault()
}
아직도 못 푼 객체 비교의 진실 ;;
리스트 컴포넌트에는 해당 Do,Done,Doing 을 이루는 전체 div에 onDragOver, onDrop이벤트를 걸었고
리스트 태그인 li에는 onDragStart를 넣었다.
코드를 다 넣으면 괜히 블로그 길만 길어서 보기도 불편하고 핵심 함수만 남김
어차피 내가 나중에 또 볼꺼기 때문
자세한 코드는
https://github.com/hyunjunyong/react-study
여기다 남겨뒀으니 까먹으면 확인할 수 있도록
※ 문뜩 든생각인데 내가 저렇게 링크 걸어두고 나중에 저걸 투두 지우고 다른걸로 만드는 만행을 저지르진 않겠지....?
에이 설마.../