Repository navigation
[0/1주차/눈송이]워크북 제출합니다. - #4
Conversation
|
LGTM! 눈송이 수고많으셨습니다~ node_modules 안에는 프로젝트 실행에 필요한 모든 라이브러리가 포함되어 있어 굉장히 용량이 큽니다. 일반적으로 협업 시에는 .gitignore 파일을 생성하여 **/node_modules/ , **/dist/ 를 적어 자동으로 제거되도록 하는 방법을 사용할 수 있고 지금은 직접 해당 디렉토리들을 삭제 하셔도 됩니다! 그리고 이건 tip인데 keyword 디렉토리 안에 넣을 markdown 파일 생성을 노션에서도 md 파일 생성이 가능합니다. |
|
그리고 2주차부터는 commit을 keyword, practice, mission로 각각 구분해서 올려주세요! |
| ⭐️왜 TypeScript를 학습해야 할까요? | ||
| JavaScript에 “타입 시스템”을 추가한 프로그래밍 언어입니다. | ||
| 주요 특징으로는 정적 타입을 지원하고, 명확한 타입으로 인해 협업에 매우 유리합니다. 또, 점진적으로 적용이 가능해서 js코드에 천천히 ts를 도입할 수 있습니다. |
There was a problem hiding this comment.
다음엔 마크다운 문법을 쓰면 좋을 것 같아요!
| background: #333; | ||
| color: #fff; | ||
| padding: 20px; | ||
| transform: translateX(100%); /* 기본 숨김 */ |
There was a problem hiding this comment.
사이드바를 transform으로 숨겼다가 클래스 토글로 열고 닫게 구현한 점이 깔끔해서 좋은 것 같습니당
| if (isDone) { | ||
| button.textContent = '삭제'; | ||
| button.style.backgroundColor = 'red'; | ||
| button.addEventListener('click', (): void => deleteTask(todo)); |
There was a problem hiding this comment.
button.addEventListener('click', ():void=>{
if(isDone){
deleteTodo(todo);
}
else{
completeTodo(todo);
}
});
으로 영상에서는 보여지던데, 혹시 나누어서 올린 이유가 있을까요??
There was a problem hiding this comment.
const todoInput = document.getElementById('todo-input') as HTMLInputElement;
const todoForm = document.getElementById('todo-form') as HTMLFormElement;
const todoList = document.getElementById('todo-list') as HTMLUListElement;
const doneList = document.getElementById('done-list') as HTMLUListElement;
type Todo = {
id: number;
text: string;
};
let todos: Todo[] = [];
let doneTasks: Todo[] = [];
// 할 일 & 완료된 일 렌더링
const renderTask = (): void => {
todoList.innerHTML = '';
doneList.innerHTML = '';
todos.forEach((todo: Todo): void => {
const li = createTodoElement(todo, false);
todoList.appendChild(li);
});
doneTasks.forEach((todo: Todo): void => {
const li = createTodoElement(todo, true);
doneList.appendChild(li);
});
};
// input 값 가져오기
const getTodoText = (): string => {
return todoInput.value.trim();
};
// 새로운 할 일 추가
const addTodo = (text: string): void => {
todos.push({ id: Date.now(), text });
todoInput.value = '';
renderTask();
};
// 완료 처리
const completeTask = (todo: Todo): void => {
todos = todos.filter((t): boolean => t.id !== todo.id);
doneTasks.push(todo);
renderTask();
};
// 삭제 처리
const deleteTask = (todo: Todo): void => {
doneTasks = doneTasks.filter((t): boolean => t.id !== todo.id);
renderTask();
};
// 공통 li 생성 함수
const createTodoElement = (todo: Todo, isDone: boolean): HTMLLIElement => {
const li = document.createElement('li');
li.classList.add('todo-item');
li.textContent = todo.text;
const button = document.createElement('button');
button.classList.add('render-container__item-button');
// 버튼 모양은 조건으로 나눔
if (isDone) {
button.textContent = '삭제';
button.style.backgroundColor = 'red';
} else {
button.textContent = '완료';
button.style.backgroundColor = 'green';
}
// 클릭 이벤트는 한 번만 등록, 내부에서 분기
button.addEventListener('click', (): void => {
if (isDone) {
deleteTask(todo);
} else {
completeTask(todo);
}
});
li.appendChild(button);
return li;
};
// form 제출 이벤트
todoForm.addEventListener('submit', (e: Event): void => {
e.preventDefault();
const text = getTodoText();
if (text) {
addTodo(text);
}
});
renderTask();
말씀하신대로 수정해서 적용했습니다!
|
LGTM~ 눈송이 수고하셨습니다! 머지해주세요~ merge pull request |
|
옙 머지했습니다! |
✅ 워크북 체크리스트
✅ 컨벤션 체크리스트
📌 주안점