일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 프로그래머스 데브코스
- 프로그래머스 데브코스 프론트엔드
- 폼 입력 바인딩
- Vue
- 고양이 사진 검색기
- SCSS import
- Spacer
- vue 지역 컴포넌트
- react next
- 리스트 렌더링
- KDT 프로그래머스
- 프로그래머스 K_Digital Training
- intersection opserver
- SCSS forward
- 이벤트 수식어
- KDT 프로그래머스 데브코스 프론트엔드
- 다른컴퓨터에서 git사용
- flex
- SCSS extend
- netlify redirect
- 쌓임맥락
- git 같은계정 다른 컴퓨터
- vue mixin
- postcss
- 리액트
- vuex map
- nextjs사용법
- 프로그래머스 프론트엔드 데브코스
- SCSS use
- vue 이벤트 수신
- Today
- Total
혼자 적어보는 노트
프로그래머스 데브코스 TIL - Day 16 본문
✅ 학습 목차
- [DAY 16] VanillaJS를 통한 자바스크립트 기본 역량 강화 (8)
✅ 새롭게 학습한 부분
- 자동 저장 편집기 만들기 (실습)
debouce 사용
let timer = null;
const editor = new Editor({
$target: $page,
initialState: post,
onEditing: (post) => {
if (timer !== null) {
clearTimeout(timer);
}
timer = setTimeout(async () => {
setItem(postLocalSaveKey, {
...post,
tempSaveDate: new Date(),
});
}, 500);
},
});
이전에 스터디를 하면서 처음 접했던 기능이지만 한번 더 복습 차원에서 정리를 하였다.
텍스트를 입력할 때마다 서버에 요청을 하면 서버에 부담이 되기 때문에
debounce기법을 사용하여 마지막 입력이 끝나고 지정한 시간이 지나면
서버에 요청을 하여 부하를 줄일 수 있다.
예시 코드에서는 일단 localstorage에 저장하는 것으로 구현했지만,
localstorage에는 1초의 시간 후에 저장하고, 서버에는 조금 더 여유 있는 시간으로 조절하는 등
분리해서도 활용이 가능하다.
name속성을 사용한 state 변경
여러개의 text input을 다루다보면 change이벤트를 하나씩 달아주어야 해서 불편함이 있는데
name 속성을 사용하여 하나의 이벤트로 핸들링 할 수 있다.
$editor.addEventListener("keyup", (e) => {
const { target } = e;
const name = target.getAttribute("name");
const nextState = {
...this.state,
[name]: target.value,
};
this.setState(nextState);
onEditing(nextState);
});
이전에 아이디/비밀번호 관련되서 여러 input을 다룰 때 사용했었지만
막상 나중에 써야 할 때 까먹는 부분중 하나이다.😓
커스텀 이벤트
커스텀 이벤트 또한 이전에 스터디를 통해 접했던 부분이지만
자주 사용하지 않아서 손에 익지는 않았다.
// 부모 컴포넌트에서 이벤트 생성
window.addEventListener("route-change", (e) => {
const { nextUrl } = e.detail;
history.pushState(null, null, nextUrl);
this.route();
});
// 자식 컴포넌트에서 이벤트 호출
window.dispatchEvent(
new CustomEvent("route-change", {
detail: {
nextUrl: `/posts/${id}`,
},
})
);
부모 컴포넌트에서 생성한 함수를 자식 컴포넌트에게
전달을 할 때 depth가 깊은 경우 커스텀 이벤트를 통해 한번에 이벤트 호출을 할 수 있다.
커스텀 이벤트의 모듈화
router.js
const ROUTE_CHANGE_EVENT_NAME = "route-change";
export const inItRouter = (callback) => {
window.addEventListener(ROUTE_CHANGE_EVENT_NAME, (e) => {
const { nextUrl } = e.detail;
history.pushState(null, null, nextUrl);
callback();
});
};
export const push = (nextUrl) => {
window.dispatchEvent(
new CustomEvent("route-change", {
detail: {
nextUrl,
},
})
);
};
파일을 생성하여 이벤트를 생성하는 함수와 이벤트를 호출하는 함수를 만들어서
모듈화를 시킴으로써 재사용성을 높일 수 있다.
사실 너무 남용하면 안된다는 이야기를 듣고 나서 쓸 생각을 안했던 것 같다.
route처럼 이벤트가 발생하는 시점이 명확할 때에는 사용해도 될 듯 하다.
반복되는 button 컴포넌트 모듈화
const $moveListButton = document.createElement("button");
$moveListButton.innerHTML = "목록으로";
$page.appendChild($moveListButton);
$moveListButton.addEventListener("click", () => {
push("/");
});
위와 같은 버튼들이 각 컴포넌트 안에 있을 때
반복적으로 작성하지 않고 하나의 컴포넌트로 만들어 두고 모듈화를 할 수 있다.
리액트에서는 반복되는 코드들을 컴포넌트화 하여 관리를 했었는데
Vanilla JS에서도 이렇게 작은 단위도 컴포넌트화 할 수 있다는 것을 깨달았다.
contentEditable
지금까지 text box를 다룰 일이 많지 않았어서 보통 textarea로 구현을 했었는데
contentEditable을 처음 알게 되었다.
<div name="content" contentEditable="true">${this.state.content}</div>
간단하게 div 속성에 contentEditable="true"를 적어서 사용할 수 있다.
❗ 서버에서 데이터를 받을 경우 개행이 \n값으로 들어오기 때문에
div안의 텍스트들이 줄바꿈이 되지 않는다.
==> \n을 <br>로 변경하여 해결할 수 있다.
this.state.content.replace(/\n/g, "<br>");
기본 사용 방법만 익혔지만 내일부터 하게 될 과제에서 확실하게 사용을 해 볼 예정이다.
✍ 느낀 점
오늘의 강의는 이번 주에 진행 할 과제를 위한 강의들이였다.
새롭게 접한 부분도 있었고 이전에 알고 있었던 내용을 한번 더 되짚어볼 수 있었던 시간이였다.
점점 내부에 기능들이 추가되면서 복잡하다고 느끼게되면서도
vanilla JS에 대해 알아가면 알아갈 수록 재밌는 것 같다.
내일부터 시작하게 될 이번 주 과제를 잘 마무리 할 수 있길!! 🙏🙏
'스터디' 카테고리의 다른 글
프로그래머스 데브코스 TIL - Day 20 (1) | 2022.04.15 |
---|---|
프로그래머스 데브코스 TIL - Day 19 (0) | 2022.04.14 |
프로그래머스 데브코스 TIL - Day 15 (0) | 2022.04.08 |
프로그래머스 데브코스 TIL - Day 14 (0) | 2022.04.08 |
프로그래머스 데브코스 TIL - Day 13 (0) | 2022.04.06 |