#6 Trello

๊นƒํ—ˆ๋ธŒ

#6.2 Drag and Drop part One

react-beautiful-dnd

์•„๋ž˜ ๋งํฌ์™€ ๊ฐ™์ด Drag&Drop ๊ธฐ๋Šฅ์œผ๋กœ ๋ฆฌ์ŠคํŠธ๋ฅผ ์˜ฎ๊ฒจ ์ˆ˜์ •ํ•  ๋•Œ ์œ ์šฉํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

DragDropContext โ‡’ ๋‚ด๋ถ€์— ์žˆ์–ด์•ผ ์ž‘๋™ํ•จ

Droppable โ‡’ ๋“œ๋กญ : dnd ๊ธฐ๋Šฅ์ด ์‹ค์ œ๋กœ ์ž‘๋™ํ•  ๋ฒ ์ด์Šค, ํ•จ์ˆ˜ํ˜•์œผ๋กœ ์ž‘์„ฑํ•ด์•ผํ•จ

Draggable โ‡’ ๋“œ๋ž˜๊ทธ : Drag ๊ธฐ๋Šฅ, ํ•จ์ˆ˜ํ˜•์œผ๋กœ ์ž‘์„ฑํ•ด์•ผํ•จ

<DragDropContext onDragEnd={onDragEnd}>
      <div>
        <Droppable droppableId='one'>
          {() =>
            <ul>
              <Draggable draggableId='first' index={0}>
                {() => <li>One</li>}
              </Draggable>
              <Draggable draggableId='seound' index={1}>
                {() => <li>Two</li>}
              </Draggable>
            </ul>}
        </Droppable>
      </div>
    </DragDropContext>

Storybook

npm i react-beautiful-dnd
npm i --save-dev @types/react-beautiful-dnd

#6.3 Drag and Drop part Two

Droppable & Draggable์˜ ๋‚ด๋ถ€ props

innerRef ์†์„ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ˆ˜ํ–‰๋œ๋‹ค.

dragHandleProps ํŠน์ • ์˜์—ญ์„ ํ†ตํ•ด์„œ๋งŒ ๋“œ๋ž˜๊ทธ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒํ•จ

draggableProps ๋“œ๋ž˜๊ทธํ•  ์˜์—ญ ์ง€์ •

<DragDropContext onDragEnd={onDragEnd}>
      <div>
        <Droppable droppableId='one'>
          {(magic) =>
            <ul ref={magic.innerRef} {...magic.droppableProps}>
              <Draggable draggableId='first' index={0}>
                {(provided) => <li ref={provided.innerRef} {...provided.draggableProps} {...provided.dragHandleProps} >One</li>}
              </Draggable>
              <Draggable draggableId='seound' index={1}>
                {(provided) => <li ref={provided.innerRef} {...provided.draggableProps} {...provided.dragHandleProps} >Two</li>}
              </Draggable>
            </ul>}
        </Droppable>
      </div>
    </DragDropContext>

#6.4 Styles and Placeholders

placeholder

Draggable ์š”์†Œ๋ฅผ ๋“œ๋ž˜๊ทธํ•˜๋Š”๋™์•ˆ Droppable์— position:fixed๋ฅผ ์ ์šฉํ•ด ํฌ๊ธฐ๊ฐ€ ์ค„์–ด๋“œ๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•œ๋‹ค.


#6.5 Reordering

recoil ๊ธฐ๋ณธ ์„ธํŒ…

onDragEnd ๋“œ๋ž˜๊ทธ๊ฐ€ ์ข…๋ฃŒ๋์„๋•Œ์˜ ์„ธํŒ…

.type - ๋“œ๋ž˜๊ทธ๋œ Draggable์˜ type

.source - ๋“œ๋ž˜๊ทธ ์‹œ์ž‘ ์œ„์น˜

.destination - ๋“œ๋ž˜๊ทธ ์ข…๋ฃŒ ์œ„์น˜, ์‹œ์ž‘๊ณผ ๊ฐ™์€ ์œ„์น˜๋ผ๋ฉด null

splice(a, b, c) - a ์‹œ์ž‘์œ„์น˜ b ์ง€์šธ๊ฐœ์ˆ˜ c ์ถ”๊ฐ€ํ• ๋‚ด์šฉ


#6.6 Reordering Two

onDragEnd, splice๋กœ ๋ชฉ๋ก ์ˆ˜์ • ๊ตฌํ˜„ ์™„๋ฃŒ

li๋กœ ๋ชฉ๋ก ๊ตฌ๋ถ„์‹œ key๋ฅผ ์ œ๋Œ€๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ draggableId๋ฅผ key๋กœ ์ด์šฉํ•œ๋‹ค.

โ‡’ index๋ฅผ key๋กœ ์‚ฌ์šฉํ• ๋•Œ ๊ฒฝ๊ณ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— & index๋ฅผ key๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์ˆœ์„œ๊ฐ€ ๋’ค๋ฐ”๋€Œ๋ฉด์„œ ์ข‹์ง€์•Š์€ ๊ฒฐ๊ณผ๋ฅผ ์ดˆ๋ž˜ํ•œ๋‹ค


#6.7 Performance

์ฝ”๋“œ ์ •๋ฆฌ

Drag๋กœ ์ด๋™ํ•˜๋ฉด ๋ชจ๋“  ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ƒˆ๋กœ ๋ Œ๋”๋ง๋˜๋Š”๊ฒŒ ๋ˆˆ์— ๋ณด์ž„ โ‡’ ๋ถ€๋ชจ์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฏ€๋กœ ๋ชจ๋“  ์ž์‹ ์š”์†Œ๋“ค์—์„œ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•จ

โ‡’ React Memo๋Š” prop์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์œผ๋ฉด ์š”์†Œ๋“ค์ด ๋ Œ๋”๋ง ๋˜์ง€ ์•Š๋„๋ก ์„ค์ •ํ•จ

export default DraggableCard;
=>
export default React.memo(DraggableCard);

#6.8 Multi Boards

์—ฌ๋Ÿฌ ์ƒํƒœ ๋ฐ•์Šค?๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค.. ๊ทธ๋Ÿฐ๋ฐ ํ•˜๋‚˜์˜ recoil state์—์„œ..

{1: [], 2: [], 3: []} ๊ฐ™์€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ด๊ธฐ์— ๋‹ค์Œ์˜ ๊ธฐ๋Šฅ์œผ๋กœ ์ƒํƒœ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

Object.keys(obj)

๊ฐ์ฒด์˜ ์†์„ฑ key๋“ค์„ ๋ฐ˜๋ณต๋ฌธ๊ณผ ๋™์ผํ•œ ์ˆœ์„œ๋กœ ์ˆœํšŒ๋˜๋Š” ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

.map์„ ์ด์šฉํ•ด ๋‹ค์‹œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์—˜๋ฆฌ๋จผํŠธ๋กœ ๊ตฌ๋ถ„ํ•œ๋‹ค.


#6.9 Same Board Movement

๊ฐ™์€ Board์—์„œ ๋“œ๋ž˜๊ทธํ• ๋•Œโ€ฆ

state ๊ตฌ์กฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๊ธฐ์— ๊ทธ ๋ณ€ํ™”์— ๋งž์ถฐ์„œ state ๊ฐ’์„ ์ˆ˜์ •ํ•œ๋‹ค.

ํ•˜๋‚˜์˜ ์ƒํƒœ ๊ทธ๋ฃน ๋‚ด์—์„œ ์ง„ํ–‰๋จ


#6.10 Cross Board Movement

๋‹ค๋ฅธ Board์—์„œ ๋“œ๋ž˜๊ทธํ• ๋•Œโ€ฆ

๊ทธ๋ฃน ๊ฐ’์˜ ๋ณ€ํ™”์— ์ฃผ์˜ํ•˜๋ฉด์„œ ๊ฐ™์€ Board ๋ณ€๊ฒฝ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ state ๊ฐ’์„ ์ˆ˜์ •ํ•œ๋‹ค.


#6.11 Droppable Snapshot

๋“œ๋ž˜๊ทธํ•  ๋•Œ ๋งˆ์ง€๋ง‰ ์š”์†Œ๊ฐ€ ์‚ฌ๋ผ์ง€๋ฉด ๋†’์ด๊ฐ€ ์‚ฌ๋ผ์ง€๋ฉด์„œ ์ด๋™์— ์ œ์•ฝ์ด ์ƒ๊ธด๋‹ค.

display flex๋กœ ์‰ฝ๊ฒŒ ์ œ์•ฝ์„ ์—†์•จ ์ˆ˜ ์žˆ์Œ

& DroppableStateSnapshot ๋“œ๋ž์ด ๋ฐœ์ƒํ•˜๋Š” ์žฅ์†Œ(Droppable)์—์„œ ๋‹ค์–‘ํ•œ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Œ

isDraggingOver: boolean

ํ˜„์žฌ ์„ ํƒํ•œ Draggable์ด ํŠน์ • Droppable ์œ„์— ๋“œ๋ž˜๊น… ๋˜๋Š”์ง€ ์—ฌ๋ถ€

draggingOverWith: ?DraggabledId

Droppable ์œ„๋กœ ๋“œ๋ž˜๊ทธํ•˜๋Š” Draggable ID

draggingFromThisWith: ?DraggableId

ํ˜„์žฌ Droppable์—์„œ ๋ฒ—์–ด๋‚œ ๋“œ๋ž˜๊น…๋˜๊ณ  ์žˆ๋Š” Draggable ID

isUsingPlaceholder: boolean

placeholder๊ฐ€ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š”์ง€ ์—ฌ๋ถ€


#6.12 Final Styles

isDragging - boolean

Draggable์ด ์‹คํ–‰๋˜๋Š”์ง€ ์—ฌ๋ถ€


#6.13 Refs

Refs - React ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•ด HTML ์š”์†Œ๋ฅผ ์ง€์ •ํ•˜๊ณ , ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•

beautiful-dnd ๊ฐ€ React ์š”์†Œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์คŒ

const ~~ = useRef()


#6.14 Task Objects

toDo ์ถ”๊ฐ€ํ•˜๋Š” ๊ธฐ๋Šฅ์ถ”๊ฐ€

atoms์—์„œ state data๋ฅผ ์ •๋น„ํ•ด์•ผํ•จ

โ‡’ draggableId ๊ฐ’์„ ์ถ”๊ฐ€์ ์œผ๋กœ ์ œ๊ณตํ•ด์•ผํ•จ

&

React Hook Form

...
const {register, handleSubmit, setValue, getValue} = useForm<IForm>
...

#6.15 Creating Tasks

id ๊ฐ’์„ ๊ณ ์œ ํ•œ data๋กœ ์ œ๊ณต(Date.now())ํ•˜๋ฉด์„œ ์˜ค๋ฅ˜ ํ•ด๊ฒฐ


Last updated

Was this helpful?