๋
ธ์
ํด๋ก๋ ํ๋ก์ ํธ๋ฅผ ์งํํ์ง ์ด๋๋ง 5์ผ์ฐจ...
๊ธฐ๋ณธ์ ์ธ ์๊ตฌ์ฌํญ๋ค์ ๊ฑฐ์ ๋ค ๊ตฌํํ๋ค.
ํ์ง๋ง ๊ธฐ๋ฅ๋ง ๊ตฌํ๋์์ง ์์ํ ์๋ฌ ํธ๋ค๋ง๊ณผ ์ด๋ฒคํธ ํธ๋ค๋ง์ด ์กฐ๊ธ ๋ฏธํกํ ๋ถ๋ถ์ด ์๋ค.
ํ๋์ฉ UX๋ฅผ ๊ณ ๋ คํ์ฌ ๋ณด์ํด ๋๊ฐ ์์ ์ด๋ค!
์๋ํฐ ์
๋ ฅ๋๋ ์ ๋ชฉ๊ณผ ๋ด์ฉ์ ์ผ์ ์๊ฐ ์ง๋๋ฉด ์๋์ผ๋ก ์๋ฒ์ ์ ์ฅํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํด์ผ ํ๋ค. ์ด๊ฒ์ ๊ตฌํํ๊ธฐ ์ํด์ ์ฌ์ฉ๋ ๊ฒ์ด ์ด๋ฒคํธ ๋๋ฐ์ด์ฑ์ด๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก timer๋ฅผ ์ง์ ํ๊ณ timer๋ฅผ ์ผ์ ์๊ฐ ๋์ setTimeout
์ผ๋ก ํ
์ ๋์ด์ ํด๋น ์ด๋ฒคํธ๋ฅผ ์ง์ฐ์ํค๋ ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํํ๋ค.
๋๋ ๋
ธ์
์์ ์ฌ์ฉ์๊ฐ ๋ฌธ์์ ์ ๋ชฉ๊ณผ ๋ด์ฉ์ ์
๋ ฅํ๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ์ผ์ ์๊ฐ(๋๋ 2์ด๋ก ์ค์ ํ๋ค)์ด ์ง๋๋ฉด ํด๋น ๋ด์ฉ์ ์๋ฒ์ ์ ์ฅํ๋๋ก ๊ตฌํํ๋ค.
let timer = null;
// ์์ ์ด๋ฒคํธ ๋ฐํ์
$editHeaderInput.addEventListener('keyup', (e) => {
// ํ์ด๋จธ ์ด๊ธฐํ
if (timer !== null) clearTimeout(timer);
const newTitle = e.target.value; // ์๋ก์ด ์
๋ ฅ๊ฐ
timer = setTimeout(() => {
const { selectedDoc } = this.state;
// ์ ์ฅํ ๊ธฐ์กด ์์ ์ ์ฅ ๋ด์ฉ์ ๋ถ๋ฌ์ค๊ธฐ
const editDoc = getStorage('selectedDoc', {
title: selectedDoc.title,
content: selectedDoc.content,
});
const newDoc = { ...editDoc, title: newTitle };
// ์๋ก์ด ์์ ์ ์ฅ ๋ฌธ์๋ฅผ ์คํ ๋ฆฌ์ง์ ์ถ๊ฐ
addStorage('selectedDoc', newDoc);
// ์ ์ญ ์ํ ๊ด๋ฆฌ๋ฅผ ์ํด newDoc๋ฅผ App.js๋ก ๋ด๋ณด๋ด๊ธฐ
onEditing(newDoc);
}, 2000);
});
์์ ๊ฐ์ด ์์ ์ ์ฅ ๋ฌธ์๋ฅผ ๋ก์ปฌ ์คํ ๋ฆฌ์ง์ ์ ์ฅํ๊ณ ์์ ๋ ์์ ์ ์ฅ ๋ฌธ์์ ๋ํ ์ํ๊ฐ์ ์์ ์ปดํฌ๋ํธ๋ก ๋๊ฒจ์ค๋ค.
์ค์ ๋ ธ์ ์ ๋ฌธ์๊ฐ ์ ๋ ฅ๋ ๋๋ง๋ค ์๋ฒ์ ์ ์ฅ์ ํ๋ ๊ฒ ๊ฐ์๋ค. ํ์ง๋ง ๋๋ ๋๋ฐ์ด์ฑ์ ์ ์ฉํ๊ธฐ ์ํด์ 2์ด์ ๋๋ ์ด๋ฅผ ์ ์ฉํด๋ณด์๋ค. ์ค์ ๋ก ์๋ฒ์ ํจ์จ์ ์ผ๋ก ์์ฒญ์ ํ๋ ์์ ์ ๋ ์์ง ํ์ง ์์ ์ํ๋ผ ๋๋ฐ์ด์ฑ์ ์ ์ฉํ๋ ๊ฒ์ด ์ข์ ๊ฒ ๊ฐ๋ค๊ณ ํ๋จํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ฒคํธ ๋๋ฐ์ด์ฑ์ ํตํด input์ textarea ๋ด value ๊ฐ์ ์๋ฒ๋ก ์ ์กํ๊ณ state๋ฅผ ์
๋ฐ์ดํธํ๋ฉด์ ์ฌ๋ ๋๋ง์ ํ๋ฉด์ ํด๋น ์์์ ๋ํ ํฌ์ปค์ฑ์ด ํ๋ฆฌ๋ ์ด์๊ฐ ๋ฐ์ํ๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด title์ด๋ content์ ๊ฐ์ ๋ณ๊ฒฝํ์ ๋ currentFocus
์ํ์ element
๊ฐ์ด ํด๋น ์์์ ์ผ์นํ๋ฉด focus()
๋ฉ์๋๋ฅผ ํตํด ํฌ์ปค์ฑ์ ์ ์ง์์ผ์ฃผ๋๋ก ๊ตฌํํ๋ค.
// header
const $editHeaderInput = document.querySelector('input#title');
// ์์ ํ๊ณ ์๋ ํญ๋ชฉ์ด title์ด๋ฉด ์ฌํฌ์ปค์ฑ
if (currentFocus.element === 'title') $editHeaderInput.focus();
$editHeaderInput.value = title;
// textarea
$editor.value = !content ? '' : `${content}`;
// ์์ ํ๊ณ ์๋ ํญ๋ชฉ์ด content์ด๋ฉด ์ฌํฌ์ปค์ฑ
if (currentFocus.element === 'content') $editor.focus();
๊ฐ์ ํ์ ์์ฃผ๋๊ณผ ์คํ๋ผ์ธ ๋ชจ๊ฐ์ฝ์์ ์ด๋ฒคํธ ๋ฒ๋ธ๋ง ์ด์์ ๋ํด์ ๊ฐ์ด ๊ณ ๋ฏผ์ ํ์๋ค. ๊ฐ์์์ ๋ฐฐ์ด ์ด๋ฒคํธ ๋ธ๋ฆฌ๊ฒ์ด์
(delegation)๊ณผ e.stopPropagation()
๋ฉ์๋๋ฅผ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ง์ ์ ์ฉํ๋ ค๋ HTML ์์ ์ด๋์ ํด๋น ์ด๋ฒคํธ ๋ฒ๋ธ๋ง ๋ฐฉ์ง ์ฝ๋๋ฅผ ์ถ๊ฐํด์ผ ํ๋์ง ํท๊ฐ๋ ธ๋ค. ์ด๋ฒคํธ ๋ธ๋ฆฌ๊ฒ์ด์
์ ๋ํ ๊ตฌ์ฒด์ ์ธ ๋ฐฉ๋ฒ๊ณผ ์ด๋ฅผ ์ ์ฉํ๊ธฐ ์ํ HTML ๊ตฌํํ ๋ฐฉ์์ ์ฐพ์๋ด์ผ ๊ฒ ๋ค.
๐ ํด๋น ๋ด์ฉ์ ๊ณต๋ถํ๋ฉด์ ์ ๋ฆฌํ ๊ธ์ ๋๋ค. ํ๋ฆฐ ๋ถ๋ถ์ด๋ ์คํดํ๊ณ ์๋ ๋ถ๋ถ์ด ์๋ค๋ฉด ํผ๋๋ฐฑ ๋ถํ๋๋ฆฝ๋๋ค.