๐Ÿ™€ ๊ณ ๋‡Œ๋ก | [JS] ๋…ธ์…˜ ํด๋กœ๋‹

noopyยท2021๋…„ 8์›” 31์ผ

๊ณ ๋‡Œ๋ก

๋ชฉ๋ก ๋ณด๊ธฐ
1/3

๋ฐฐํฌ

๋…ธ์…˜ ํด๋กœ๋‹ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿก ์ตœ์ดˆ state ํ˜•ํƒœ


์›๋ž˜๋Š” App.js์—์„œ state๋ฅผ ๋‹ค ๋ฐ›์•„์™€ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋“ค์—๊ฒŒ ์ด์ฃผ๋Š” ํ˜•ํƒœ๋กœ ๊ฐ€๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ, state๋ฅผ ์กฐํ•ฉํ•ด์„œ ์–ด๋–ป๊ฒŒ ๋‚ด๋ ค์ค˜์•ผ ํ•  ์ง€ ๊ฐ์ด ์ž˜ ์•ˆ์žกํ˜”๋‹ค.

  • listPage์™€ editPage๋กœ ๋ถ„๋ฆฌ
    ๋”ฐ๋ผ์„œ listPage์™€ editPage๋กœ ๋ถ„๋ฆฌํ•ด ๊ทธ ๋ฐ‘์— ์ปดํฌ๋„ŒํŠธ๋“ค์—๊ฒŒ
    ๋ฐ์ดํ„ฐ๋ฅผ ๋ฟŒ๋ ค์ฃผ๋Š” ํ˜•์‹์œผ๋กœ ๋ฐ”๊ฟจ๋‹ค.
    ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์–ด์ฐจํ”ผ ๋ฐ›์•„์˜ฌ ๋ฐ์ดํ„ฐ๋“ค์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ ์—ญํ• ์— ๋”ฐ๋ผ ๋ถ„๋ฆฌ๋˜์—ˆ๋‹ค.
  • pushUrl๋กœ ์ „์ฒด ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ๊ด€๋ฆฌ

์ด ๋ฐฉ์‹ ๊น”๋”ํ•˜๊ณ  ์ข‹์€ ๋‘ก ใ…Žใ…Ž

์ด ๋ฐฉ์‹์ด ๊น”๋”ํ•˜๊ณ  ์ข‹๋‹ค ์ƒ๊ฐํ–ˆ์œผ๋‚˜, ๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•ด์•ผ ํ•  ๋•Œ
์• ์ดˆ์— ๊ฐ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฐ›๋Š” ๋ฐ์ดํ„ฐ๋“ค์„ ๋”ฐ๋กœ ๊ด€๋ฆฌํ•ด์ค˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—
ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ๋” ์ปค์งˆ ์ˆ˜๋ก ๋ณต์žกํ•ด์งˆ ๊ฒƒ ๊ฐ™์•˜๋‹ค.
๋˜ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•˜๋‚˜๋กœ ๋ชจ์—ฌ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—
ํ•œ ์ปดํฌ์—์„œ ๋‹ค๋ฅธ ์ปดํฌ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์„ ๊ณ ์•ˆํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ค์› ๋‹ค.
๊ธฐ์กด์˜ state๋ฅผ ์œ„์™€๊ฐ™์ด ๋‹ค์‹œ ํ•˜๋‚˜์˜ state๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„  ๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ๋“ค์„ ํ•ฉ์น˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•œ๋ฐ ๋„ˆ๋ฌด ์–ด๋ ต๋‹ค ใ…œใ…œ

๐Ÿก list-page

๐Ÿ“„ DocList

this.render

  • list๋ฅผ ์žฌ๊ท€ํ˜•ํƒœ๋กœ ๋ Œ๋”
  • storage์— ์žˆ๋Š” active key์™€ toggle key๋กœ ๋ Œ๋”ํ•  ๋•Œ ํด๋ž˜์Šค๋ฅผ ํ† ๊ธ€ํ•จ.

setState

  • state๋ฅผ ๋ณ€๊ฒฝ์‹œํ‚ด
  • ๋ Œ๋”ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•จ
  • scroll์„ ๊ณ ์ •ํ•จ.

ํด๋ฆญ ์ด๋ฒคํŠธ

  • ์ด๋ฒคํŠธ ์œ„์ž„ ํ™œ์šฉ
  • add-button: addDoc ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ํ† ๊ธ€์„ ํŽผ์นจ
  • delete-button: deleteDoc ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ํ† ๊ธ€์„ ์‚ญ์ œ
  • list-item ํด๋ฆญ
    - ์Šคํ† ๋ฆฌ์ง€์— toggle, active ํ‚ค ์ €์žฅ
  • pushUrl ํ˜ธ์ถœ ์ตœ์†Œํ™”
    • ๊ฐ™์€ list-item ํด๋ฆญ์‹œ this.render๋งŒ ์‹คํ–‰
    • ๋‹ค๋ฅผ ๊ฒฝ์šฐ pushUrl ํ˜ธ์ถœ

๐Ÿ“„ DocListPage

fetchDocs

setState

  • fetch๋ฅผ ๋ฐ›์•„์™€ state๋ฅผ ๋ณ€๊ฒฝ
  • state ๊ฐ’์ด ์œ ํšจํ•˜๋ฉด docList์—๊ฒŒ ์ „๋‹ฌ
  • docListPage๊ฐ€ ์™ผ์ชฝ์— ์ •๋ ฌ๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ insertBefore ํ™œ์šฉ

๐Ÿ“„ DocList์™€ AddRootDocButton ํ˜ธ์ถœ

  • DocList
    • addDoc
    • DeleteDoc: ๋ฌธ์„œ ์‚ญ์ œ ํ›„ root๋กœ ๋Œ์•„์˜ค๊ธฐ ์œ„ํ•ด pushUrl ์‚ฌ์šฉ
      • ๋‘๋ฒˆ์งธ ์ธ์ž false๋กœ editPage ๋ Œ๋” ์•ˆํ•จ
  • AddRootDocButton
    • DocList์™€ ๋ณ„๊ฐœ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ ์ž ์ปดํฌ๋„ŒํŠธ๋กœ ๋งŒ๋“ฆ.

๐Ÿ‘พ list-page ๊ตฌํ˜„ & ์˜ค๋ฅ˜

  1. ๋‘๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ ListPage, EditPage ์ค‘
    ListPage๊ฐ€ App์ด ์‹คํ–‰๋˜๋ฉด ๋ฐ”๋กœ render ๋ผ์•ผ ํ•˜๋Š”๋ฐ
    ์™œ EditPage๊ฐ€ ๋จผ์ € ๋ Œ๋”๋ง๋˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค...

1์ฐจ: css๋กœ direction์„ ๋ฐ”๊ฟ”์ฃผ์—ˆ๋‹ค. (๊ผผ์ˆ˜)
์›์ธ: ListPage์˜ ๋ Œ๋” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด appendChild๋กœ ๋ถ€๋ชจ์˜ ๋งˆ์ง€๋ง‰์— append๋˜๋„๋ก ํ•ด ๋†“์•˜์—ˆ๋‹ค.
๋ Œ๋”ํ•  ๋•Œ ListPage๊ฐ€ ํ•ญ์ƒ ์ฒซ๋ฒˆ์งธ ์ž์‹์œผ๋กœ ๋ Œ๋”๋ง ๋˜๊ฒŒ insertBefore๋ฅผ ๊ฑธ์–ด์คŒ!

  1. class๋กœ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ† ๊ธ€ํ•ด ์ž์‹ ui๋ฅผ ๋ณด์˜€๋‹ค ์•ˆ๋ณด์˜€๋‹ค ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ,
    ์ƒˆ๋กœ๊ณ ์นจํ•˜๋ฉด ๋‚ ์•„๊ฐ„๋‹ค.
    ์ƒํƒœ๋ฅผ ์ €์žฅํ•ด ์ ‘์€ ์ƒํƒœ๊ฐ€ ์œ ์ง€๋  ์ˆ˜ ์žˆ๋„๋ก ๋ฐ”๊ฟ”์•ผ ๋˜๋Š”๋ฐ ์•„์ง ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ฒ ๋‹ค ใ…œ

ํด๋ฆญ๋œ li์˜ id๋ฅผ ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅ ํ›„ li๋ฅผ ๋ Œ๋”ํ•  ๋•Œ id๊ฐ’์ด ์Šคํ† ๋ฆฌ์ง€์— ์žˆ์œผ๋ฉด ํ† ๊ธ€๋˜์—ˆ๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ toggled ํด๋ž˜์Šค๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.
ํ•œ๋ฒˆ ๋” ๋ˆ„๋ฅด๋ฉด ์Šคํ† ๋ฆฌ์ง€ ํ‚ค๋ฅผ ์—†์• ์ฃผ๊ณ  ์ดํ›„ ๋ Œ๋”๋ฅผ ๋Œ๋ ธ์„ ๋•Œ ํ‚ค ์ฒดํฌ ํ›„ ์—†์œผ๋ฉด toggled ํด๋ž˜์Šค๋ฅผ ์‚ญ์ œํ•œ๋‹ค.
์ด๋Ÿฌ๋ฉด ์ƒˆ๋กœ๊ณ ์นจ์„ ํ•˜๋”๋ผ๋„ ํ† ๊ธ€๋œ ์ƒํƒœ๊ฐ€ ์œ ์ง€๋œ๋‹ค.

  1. ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฒ•์„ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค.
    ๋งŽ์ด ๋งŒ๋“ค์–ด๋ณด๊ณ  ์—ฐ์Šตํ•˜๋ฉด ์ˆ™๋‹ฌํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์€๋ฐ,
    ๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„๋ถ€ํ„ฐ ๋งŒ๋“ค๊ณ  ๋น„์Šทํ•œ ๊ฒƒ๋ผ๋ฆฌ ๋ชจ์•„์„œ ์ ์  ๊ตฌ์กฐํ™”ํ•ด์„œ
    ๋ณต์žกํ•˜๊ฒŒ ์—ฐ๊ฒฐ์‹œํ‚ค๋Š” ๊ฒŒ ์•„์ง ๋ฏธ์ˆ™ํ•˜๋‹ค๊ณ  ๋А๋‚€๋‹ค.

ํŒ€์›๋“ค๊ณผ ๋งค์ผ๋งค์ผ ๋ชจ๋ฅด๋Š” ๋ถ€๋ถ„๋“ค์„ ๊ณต์œ ํ•ด๊ฐ€๋ฉฐ ๋ฐฐ์šฐ๋‹ˆ
์ปดํฌ๋„ŒํŠธ๋ฅผ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์กฐํ™”ํ•ด์•ผ ํ• ์ง€ ๊ฐ์ด ์กฐ๊ธˆ ์žกํžˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค.
(1) ๊ฐ€์žฅ ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ state๋ฅผ ์ด์ฃผ๋Š” ๋ฐฉ์‹๋„ ์žˆ๊ณ ,
(2) ๊ฐ ์ปดํฌ๋งˆ๋‹ค state๋ฅผ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ๋ฐฉ์‹๋„ ์žˆ๋‹ค.
์ง€๊ธˆ์€ ๊ฐ€์žฅ ์ตœ์ƒ์œ„ ์ปดํฌ์—์„œ ์ด์ฃผ๋Š” ๋ฐฉ์‹์ด state ๊ด€๋ฆฌ ์ธก๋ฉด์—์„œ ํšจ์œจ์ ์ด๋ผ ๋А๋‚€๋‹ค. (ํ•˜์ง€๋งŒ ์–ด๋ ต๋‹ค)

  1. ์‚ญ์ œ API ์‚ฌ์šฉ ํ›„ ์ƒˆ๋กœ๊ณ ์นจํ•˜๋ฉด ํ˜„์žฌ url์ด ์‚ญ์ œ๋œ ๋ฆฌ์ŠคํŠธ์˜ id๋กœ ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— fetch ์‹คํŒจ๊ฐ€ ๋œฌ๋‹ค.
    ์‚ญ์ œ ํ›„ pushState๋กœ ๊ฒฝ๋กœ๋ฅผ ๋ฐ”๊ฟ”์ฃผ๋ฉด ์ƒˆ๋กœ๊ณ ์นจํ–ˆ์„ ๋•Œ ๊ดœ์ฐฎ์•„์ง€๋ ค๋‚˜?

๊ตณ ๐Ÿ‘

  1. ๋ฆฌ์ŠคํŠธ๋ฅผ ํด๋ฆญํ•˜๋ฉด actived๊ฐ€ ์œ ์ง€๋˜๋„๋ก ๊ตฌํ˜„์€ ํ–ˆ๋Š”๋ฐ
    ๋’ค๋กœ๊ฐ€๊ธฐ๋ฅผ ๋ˆŒ๋ €์„ ๋•Œ actived ์ƒํƒœ๊ฐ€ ์ด์ „์œผ๋กœ ๊ฐ€๋Š” ๊ฒƒ์€ ๊ตฌํ˜„ํ•˜์ง€ ๋ชปํ–ˆ๋‹ค.
  1. onpopstate ์ด๋ฒคํŠธ์—์„œ ํ˜„์žฌ url์˜ id๊ฐ’์„ ๋”ด๋‹ค.
  2. ๊ธฐ์กด ์Šคํ† ๋ฆฌ์ง€์˜ active-key ๊ฐ’์„ id๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.
  3. this.route๋ฅผ ์‹คํ–‰ํ•˜๋ฉด url์— ๋งž์ถฐ ๊ฐ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค์‹œ ๋ Œ๋”ํ•œ๋‹ค.
  1. list-page์—์„œ render๊ฐ€ ๋˜๋”๋ผ๋„ ํ˜„์žฌ positon์„ ๊ธฐ์–ตํ•  ๊ฒƒ (์œ„๋กœ ์˜ฌ๋ผ๊ฐ€์ง€ ์•Š์„ ๊ฒƒ)

์—ญ์‹œ ์‚ฌ๋žŒ์€ ์ž”๊พ€๊ฐ€ ๋งŽ์•„์•ผ ํ•œ๋‹ค.
๋งจ ์ฒ˜์Œ์—” ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค list-page๊ฐ€ ๋ Œ๋”๋˜๋‹ˆ๊นŒ
ํด๋ฆญ ์ด๋ฒคํŠธ ๋‚ด๋ถ€์˜ ๋ถ„๊ธฐ๋œ ํ•จ์ˆ˜๋“ค ๊ฐ๊ฐ์—๊ฒŒ moveToOffset ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด
๊ฑธ์–ด์ฃผ๋ ค๋Š” ๋ฌด์‹ํ•œ ์ƒ๊ฐ์„ ํ–ˆ๋‹ค.
์ƒ๊ฐํ•ด๋ณด๋‹ˆ๊นŒ ์–ด์ฐจํ”ผ ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค render ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋‹ˆ๊นŒ
render ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ํ•ด๊ฒฐํ•˜๋ฉด ๋˜๋„ค?
ํด๋ฆญ๋œ ์š”์†Œ์— scrollIntoView ํ•จ์ˆ˜๋ฅผ ๊ฑธ์–ด์ค„ ๊บผ๋‹ˆ๊นŒ render ํ•จ์ˆ˜์—์„œ DOM ์š”์†Œ ์„ ํƒํ•ด์•ผ์ง€ ใ…Žใ…Ž
๐Ÿ‘‰๐Ÿป ์‹คํŒจ
list๊ฐ€ ์žฌ๊ท€๋กœ ๋Œ๋ฉด์„œ ๋ Œ๋”๋˜๊ธฐ ์ „์— DOM ์š”์†Œ๋ฅผ ์„ ํƒํ•˜๋ ค ํ•ด์„œ null ๊ฐ’์ด ๋ฆฌํ„ด๋จ.
๐Ÿ‘‰๐Ÿป ํ•ด๊ฒฐ
render ํ•จ์ˆ˜๋Š” setState ํ˜ธ์ถœ๋  ๋•Œ๋งŒ ์‹คํ–‰๋˜๋‹ˆ๊นŒ
setState ๋‚ด๋ถ€์—์„œ render๋ฅผ await ํ•˜๊ณ  ๊ทธ ๋‹ค์Œ์— ์„ ํƒํ•˜๋ฉด ๋˜๊ฒ ๋‹ค! ๐Ÿ‘๐Ÿ‘๐Ÿ‘


๋˜๋ฅด๋ฅด...
์ต์ˆ™ํ•ด์ง€๋ฉด ์˜ค๋ฅ˜ ์ˆ˜์ • ๋‹จ๊ณ„๊ฐ€ ๋งŽ์ด ์ค„์–ด๋“ค๊ฒ ์ง€?...

๐Ÿก edit-page

๐Ÿ“„ Editor

setState & this.render

  • this.render์—๋Š” ์ตœ์ดˆ ๋ Œ๋”๋ง ์ดˆ๊ธฐํ™”๋งŒ ํ•จ.
  • setState์—์„œ state๋ฅผ ๋ณ€๊ฒฝ ํ›„ editor ํ™”๋ฉด์— ๋ฟŒ๋ ค์คŒ.
    • App์—์„œ ์ปดํฌ๋ฅผ ์กฐ์ž‘ํ•  ๋•Œ setState๋กœ ํ•˜๊ธฐ์œ„ํ•œ ๊ตฌ์ƒ‰ ๋งž์ถ”๊ธฐ ๐Ÿ˜‰

keyup ์ด๋ฒคํŠธ

  • 1์ดˆ ๋””๋ฐ”์šด์Šค
    • setState ์‹คํ–‰
      • ๋””๋ฐ”์šด์Šค ์—†์ด state๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด contentEditable์ด ์ปค์„œ๋ฅผ ์ฒ˜์Œ์œผ๋กœ ๋˜๋Œ๋ฆฌ๋Š” ํŠน์„ฑ ๋•Œ๋ฌธ์— ๊ธ€์”จ๊ฐ€ ๊ฑฐ๊พธ๋กœ ์จ์ง.
    • onEditing ์‹คํ–‰
      • ๋ณ€๊ฒฝ๋œ state๋ฅผ onEditing์— ์ „๋‹ฌ

๐Ÿ“„ DocEditPage

ํ‚คํฌ์ธํŠธ


storage์— ์ž„์‹œ ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์™€ fetch๋กœ ๋ถˆ๋Ÿฌ์˜จ ๋ฐ์ดํ„ฐ ๊ฐ„์˜ ๋ˆˆ์น˜์‹ธ์›€

Editor ํ˜ธ์ถœ๊ณผ ์ž„์‹œ storage ์ €์žฅ

  • Editor ํ˜ธ์ถœ
    • Editor๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ์ตœ์ดˆ ๊ฐ’์„ ์Šคํ† ๋ฆฌ์ง€์—์„œ ๋ถˆ๋Ÿฌ์˜จ ๋ฐ์ดํ„ฐ๋กœ ์ „๋‹ฌ.
  • onEditing
    • editor์—์„œ 1์ดˆ ๋””๋ฐ”์šด์Šค๋กœ ๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅ
    • โš ๏ธ ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅ๋œ ๊ฐ’์„ ๋ถˆ๋Ÿฌ์˜ค๊ณ  fetch ๋ฐ์ดํ„ฐ์™€ ๋น„๊ตํ•˜๊ณ  ์‚ญ์ œํ•˜๋Š” ๊ณผ์ •์—์„œ list-page๊ฐ€ ๊ป„๋–ก๋Œ.
      ์ž„์‹œ ๋ฐฉํŽธ์œผ๋กœ 0์ดˆ ๋””๋ฐ”์šด์Šค๋ฅผ ๊ฑธ์–ด ๋น„๋™๊ธฐ๋กœ ์ž‘๋™ํ•˜๋„๋ก ํ•จ.

setState

  • DocEditPage์˜ setState๋Š” App์—์„œ routeํ•  ๋•Œ, ์Šคํ† ๋ฆฌ์ง€์™€ ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ๋ฅผ ๋น„๊ตํ•  ๋•Œ ํ˜ธ์ถœ๋จ
  • ํ˜„์žฌ state.id์™€ nextState.id๊ฐ€ ๋‹ค๋ฅผ ๋•Œ ๋‘˜์ด ๋งž์ถฐ์ฃผ๋Š” ์ž‘์—…
    • ์ƒˆ๋กœ ๋“ค์–ด์˜จ id๋ฅผ ์Šคํ† ๋ฆฌ์ง€ ํ‚ค๋กœ ๋ฐ”๊ฟˆ
    • ์ƒˆ๋กœ ๋“ค์–ด์˜จ state๋ฅผ this.state๋กœ ๋ฐ”๊ฟˆ
    • fetchDoc ์‹คํ–‰
  • ๊ฐ™์„ ๋•Œ editor์˜ state๋ฅผ ๋ณ€๊ฒฝ

fetchDoc


ํ•˜๋Š” ์ผ: ๋” ์ตœ์‹ ๊ฐ’์„ state๋กœ ๋ณ€๊ฒฝ์‹œ์ผœ editor์— ๋ฐ˜์˜.

  • ๋ฐฉ๊ธˆ ๋ฐ”๋€ state.id๋กœ ์„œ๋ฒ„์™€ ์Šคํ† ๋ฆฌ์ง€์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ด.
  • ์Šคํ† ๋ฆฌ์ง€ ๊ฐ’์ด ์ตœ์‹ ์ผ ๊ฒฝ์šฐ
    • ์Šคํ† ๋ฆฌ์ง€ ๊ฐ’์œผ๋กœ ์„œ๋ฒ„์— ๋ฐ˜์˜
    • ์ž„์‹œ ์Šคํ† ๋ฆฌ์ง€๊ฐ’ ์‚ญ์ œ
    • pushUrl ์‹คํ–‰ (๋‘๋ฒˆ์งธ ์ธ์ž false๋กœ edit-page ๋ Œ๋” ์•ˆํ•จ)
  • nextDoc์ด ์ตœ์‹ ์ผ ๊ฒฝ์šฐ(route๋กœ ๋ Œ๋”๋ง๋  ๋•Œ)
    • ์ƒˆ๋กœ routing ๋๋‹ค๋Š” ๋œป์œผ๋กœ id๋ฅผ ๋งž์ถฐ์ฃผ๊ธฐ

๊ธฐํƒ€

๐Ÿ‘พ edit-page ๊ตฌํ˜„ & ์˜ค๋ฅ˜

  1. contentEditable์ด ์—”ํ„ฐ๋ฅผ ์น  ๋•Œ๋งˆ๋‹ค div๋กœ ๊ตฌ๋ถ„์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์—
    ๋จผ๊ฐ€ drag & drop์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค. ์—ฐ๊ตฌํ•ด๋ด์•ผ๊ฒ ๋‹ค

  2. render๊ฐ€ ๋˜๋ฉด contentEditable์—์„œ๋Š” ์ปค์„œ๊ฐ€ ์ฒ˜์Œ์œผ๋กœ ๋Œ์•„๊ฐ„๋‹ค.
    ๋•Œ๋ฌธ์— keyup ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค state๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด์„œ ํ•œ ๊ธ€์ž ์น  ๋•Œ๋งˆ๋‹ค ์ปค์„œ๊ฐ€ ์ฒ˜์Œ์œผ๋กœ ๋Œ์•„๊ฐ€ ๊ธ€์”จ๊ฐ€ ๊ฑฐ๊พธ๋กœ ์จ์ง€๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ–ˆ๋‹ค.

state ๋ณ€๊ฒฝ ์‹œ๊ธฐ๋ฅผ 1์ดˆ ์ •๋„ ๋””๋ฐ”์šด์Šคํ•ด์„œ keyup ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋• state๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๋‹ค๊ฐ€ 1์ดˆ ํ›„์— state๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์„œ๋ฒ„๋กœ ๋ณด๋‚ด์คฌ๋‹ค. ์„œ๋ฒ„์—์„œ๋Š” ๋”ฐ๋กœ ๋””๋ฐ”์šด์Šค๋ฅผ ์ฃผ์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ์ €์žฅ๋˜๋„๋ก ๋ฐ”๊พธ์—ˆ๋‹ค.

๋˜๋‹ค๋ฅธ ๋ฌธ์ œ: ๊ธ€์”จ๊ฐ€ ๊ฑฐ๊พธ๋กœ ์จ์ง€๋Š” ํ˜„์ƒ์€ ๋ง‰์•˜์œผ๋‚˜ state๊ฐ€ ์ €์žฅ๋  ๋•Œ๋งˆ๋‹ค ์–ด์จ‹๋“  ๋‹ค์‹œ ์ฒ˜์Œ์œผ๋กœ ์ปค์„œ๊ฐ€ ๋Œ์•„๊ฐ”๋‹ค. ๋˜, ํ™”๋ฉด flikering ๋ฌธ์ œ ๋ฐœ์ƒ.

  • focus ์‹œ outline์„ ๊ฐ์ถฐ์„œ flikering์„ ์†์ผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์€๋ฐ
    ์ ‘๊ทผ์„ฑ ๋ฌธ์ œ๋กœ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค.
  1. ์‹ค์‹œ๊ฐ„ title ์—…๋ฐ์ดํŠธ์— ๊ด€ํ•ด

๋‚™๊ด€์  ์—…๋ฐ์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•ด keyup ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ๋ฐ”๋€Œ๋Š” title ๊ฐ’์„
list-page์—๊ฒŒ ๋ฐ”๋กœ๋ฐ”๋กœ ๋„˜๊ฒจ์ฃผ๊ณ  ์‹ถ์—ˆ๋‹ค.
ํ•˜์ง€๋งŒ app์„ ์ œ์™ธํ•˜๊ณค ๊ฐ ์ปดํฌ๋„ŒํŠธ์˜ state๊ฐ€ ๋”ฐ๋กœ ๊ด€๋ฆฌ๋˜๊ณ  ์žˆ์–ด์„œ
edit-page์—์„œ list-page์˜ state์— ์ ‘๊ทผํ•  ๋ฐฉ๋ฒ•์ด ์‚ฌ์‹ค์ƒ ์—†์—ˆ๋‹ค.
keyup ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค put API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์—†๊ณ ...
customEvent๋กœ list์˜ state๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์–ด๋–จ๊นŒ?
๋ญ”๊ฐ€ ํšจ์œจ์ ์ด์ง€ ๋ชปํ•œ ๊ฒƒ ๊ฐ™์€๋ฐ ๐Ÿง

๐Ÿก App

  • App์€ ์‚ฌ์‹ค์ƒ ์กฐ์ข…์ˆ ์‚ฌ์ž„. App์—์„œ ์ปดํฌ๋„ŒํŠธ์˜ state๋ฅผ ๋ฐ”๊พธ์ง„ ์•Š์Œ.
    ์œ ํ‚ค์ฆˆ๋ฅผ ์กฐ์ข…ํ•˜๋Š” ํ‘๋งˆ์ˆ ์‚ฌ

this.route

  • root์—๋Š” docListPage๋งŒ.
    • list-item ์‚ญ์ œ ์‹œ root๋กœ ๊ฐ€๋„๋ก ํ–ˆ๋Š”๋ฐ ๊ธฐ์กด์— ๋ Œ๋”๋ง ๋˜์–ด์žˆ๋˜ docEditPage๋Š” ์‚ฌ๋ผ์ง€์ง€ ์•Š์Œ.
    • ๋•Œ๋ฌธ์— docEditPage๋ฅผ ๋ณด์˜€๋‹ค ์•ˆ๋ณด์˜€๋‹ค ํ•˜๋Š” (in)visible ํ•จ์ˆ˜ ํ™œ์šฉ
  • ์„ ํƒ์  routing
    • pushUrl์˜ ๋‘๋ฒˆ์งธ ์ธ์ž๋กœ false๋ฅผ ์ฃผ๋ฉด docEditPage๋Š” routing ์•ˆ๋จ.

pushUrl

  • ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์—์„œ pushUrl์˜ ๋‘๋ฒˆ์งธ ์ธ์ž(routeEdit)๋ฅผ false๋กœ ๋„ฃ๊ณ  ํ˜ธ์ถœํ•  ๋•Œ
    • pushRouter์˜ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด์„œ url์„ ๋ฐ”๊พธ๊ณ  onRoute๋ฅผ ์‹คํ–‰
    • App์—์„  routeEdit์ด true์ผ ๋•Œ๋งŒ DocEditPage๋ฅผ routing.

onpopstate

  • ๋’ค๋กœ๊ฐ€๊ธฐ ๋ผ์šฐํŒ…
    • actived item ๋”ฐ๋ผ๊ฐ€๊ธฐ
      • list-item์ด ์‚ญ์ œ๋˜๊ฑฐ๋‚˜ root ํŽ˜์ด์ง€๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด
        url์— ๋”ฐ๋ผ ์Šคํ† ๋ฆฌ์ง€์˜ active key๋„ ํ•จ๊ป˜ ๋ฐ”๊ฟ”์ฃผ๊ณ  route ์‹œํ‚ด
      • ์œ„ ๊ฒฝ์šฐ๋ผ๋ฉด active๋ฅผ ํ’€์–ด์คŒ

๐Ÿ‘พ App ๊ตฌํ˜„ & ์˜ค๋ฅ˜

  1. pathname.startsWith ์„ ํ–ˆ๋”๋‹ˆ ๊ณ„์† false๊ฐ€ ๋–ด๋‹ค.
    pathname.indexOf๋กœ ์ฐพ์•˜์„ ๋• ์ž˜ ๋‚˜์˜ค๋Š”๋ฐ ๋ฌด์Šจ ์ฐจ์ด๊ฐ€ ์žˆ์„๊นŒ?

  2. route ๊ฒฝ๋กœ๋ฅผ ๋ฐ”๊พธ์ž css๊ฐ€ ์•ˆ๋จนํ˜”๋‹ค.

์›์ธ: css ๊ฒฝ๋กœ๋ฅผ ./ ๋กœ ํ˜„์žฌ ๊ฒฝ๋กœ๋ถ€ํ„ฐ ์‹œ์ž‘ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—
ํ˜„์žฌ ํŽ˜์ด์ง€์™€ ๊ด€๋ จ๋œ ๊ฒฝ๋กœ๋ฅผ ์ฐพ์œผ๋ ค๊ณ  ์‹œ๋„ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.
ํ•ด๊ฒฐ: / (root)๋กœ ๋ฐ”๊พธ์–ด ํ•ด๊ฒฐํ–ˆ๋‹ค.

ํŒ€์› ๋ฆฌ๋ทฐ

  • ์‚ฌ์šฉ์ž์—๊ฒŒ textarea๊ฐ€ ์žˆ๋Š”์ง€ ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ๊ฒŒ
    • contentEditable ์‚ฌ์ด์ฆˆ ํ‚ค์šฐ๊ธฐ | border ๋งŒ๋“ค๊ธฐ | placehoder ์‚ฌ์šฉํ•˜๊ธฐ
  • ๋””๋ฐ”์šด์Šค๋กœ ์„œ๋ฒ„์— ์ €์žฅ๋˜๊ธฐ ์ „์— ๋‹ค๋ฅธ ๋ฆฌ์ŠคํŠธ๋กœ ๋“ค์–ด๊ฐ€๋ฉด ํ•ด๋‹น ๋ฆฌ์ŠคํŠธ ๊ฐ’์ด ๋ฐ”๋€œ
    • ํ˜„์žฌ url ๊ธฐ์ค€์œผ๋กœ id ์„ ํƒ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒ.

๐Ÿก ํ•  ์ผ

  • โœ… ๋’ค๋กœ๊ฐˆ ๋•Œ ํ˜„์žฌ url์˜ id๋กœ active-doc์„ ๋ฐ”๊พธ๊ณ  render๋กœ ๋ฐ˜์˜ํ•ด์•ผ ํ•จ
  • ๐Ÿ‘€ textarea์˜ ์ปค์„œ๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ–ˆ์„ ๋•Œ์—๋„ ๊ทธ๋Œ€๋กœ ์œ„์น˜ํ•˜๋„๋ก
  • โœ… list-page์—์„œ render๊ฐ€ ๋˜๋”๋ผ๋„ ํ˜„์žฌ positon์„ ๊ธฐ์–ตํ•  ๊ฒƒ (์œ„๋กœ ์˜ฌ๋ผ๊ฐ€์ง€ ์•Š์„ ๊ฒƒ)
  • โœ… storage key ๊ฐ’ ์ƒ์ˆ˜ํ™”
  • โœ… editor์— ๊ธ€์“ฐ๋ฉด editor ์ž์ฒด ํŽ˜์ด์ง€๋Š” render๋˜์ง€ ์•Š๊ณ  list๋งŒ ๋ Œ๋”๋˜๋„๋ก ๋ฐ”๊พธ๊ธฐ. (setState๋ž‘ render๋ฅผ ๋ถ„๋ฆฌํ•ด์•ผ ํ•˜๋‚˜?)
  • โœ… ์ œ๋ชฉ ์ž…๋ ฅ ํ›„ ๋ฐ”๋กœ ์ปจํ…ํŠธ ์ž…๋ ฅํ•ด๋„ ๋‹ค ์ €์žฅ๋˜๋„๋ก ๋งŒ๋“ค๊ธฐ
  • โœ… list๊ฐ€ ํด๋ฆญ๋  ๋•Œ๋งˆ๋‹ค get ์š”์ฒญ์œผ๋กœ ๋ฐ›์•„์˜ค๋Š”๋ฐ, ๋งŒ์•ฝ ๊ฐ™์€ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ˆ„๋ฅผ ๊ฒฝ์šฐ์—” (์ง์ „ id === ํ˜„์žฌ id)
    fetchํ•˜์ง€์•Š๊ณ  render๋งŒ ์‹œ์ผœ์คŒ.
  • โœ… ์‚ญ์ œ ์‹œ ํ† ๊ธ€๋œ ๋ฌธ์„œ id๋„ ์Šคํ† ๋ฆฌ์ง€์—์„œ ๋‚ ๋ฆฌ๊ธฐ
  • โœ… title | content ๊ฐ’์ด ์žˆ์„ ๋•Œ๋งŒ ์ €์žฅ
  • ๐Ÿ‘€ ์ €์žฅ๋  ๋•Œ ์˜ค๋ฅธ์ชฝ ์œ„์— ์•Œ๋ ค์ฃผ๊ธฐ
profile
๐Ÿ’ช๐Ÿป ์•„๋Š” ๊ฑธ ์„ค๋ช…ํ•  ์ค„ ์•„๋Š” ๊ฐœ๋ฐœ์ž ๋˜๊ธฐ

0๊ฐœ์˜ ๋Œ“๊ธ€