-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[ 2주차 기본 과제 ] 가계부 #7
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
HISTORY_LIST 데이터로 접근해서 분기별로 렌더링 처리하는 코드가 아주 인상깊었어요 !
저랑 접근은 비슷한데 다르게 구현된 부분들을 보며 많이 배워갑니다아
새롭게 알아가는 이벤트들도 있어서 찾아보며 코드 리뷰했어요 흐흐 덕분에 새로운 것들 공부 하고 갑니다 😎
과제하느라 고생했어요오 💗💗💗
const priceSpan = document.createElement("span"); | ||
priceSpan.textContent = (price > 0 ? "+" : "") + price.toLocaleString(); | ||
priceSpan.className = price < 0 ? "minus_price" : "plus_price"; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
오 여기서 한 번에 처리하는 거 구웃이네요 굿굿
historyList.forEach((el) => { | ||
el.price > 0 ? (plus += el.price) : (minus -= el.price); | ||
}); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
삼항 연산자를 아주 야무지게 잘 사용하네용 👍🏻
const plusItems = document.querySelectorAll(".plus_item"); | ||
const minusItems = document.querySelectorAll(".minus_item"); | ||
plusItems.forEach((item) => { | ||
item.style.display = plusChecked ? "flex" : "none"; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
오.. 저 맨날 display: block으로 바꾸곤 했는데 생각해보니 flex로 바꾸어도 아무 이상 없겠군요...
메모메모
const deleteModal = document.querySelectorAll(".modal_bg")[0]; | ||
deleteModal.style.display = "flex"; // 모달 띄우기 | ||
|
||
const deleteYesBtn = document.querySelectorAll(".delete_yes")[0]; | ||
const deleteNoBtn = document.querySelectorAll(".delete_no")[0]; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 부분들 querySelectorAll 로 접근한 이유가 있을까요?
저는 중복되는 요소들이 아니기 때문에 id값으로 설정 후 접근했는데 민서도 그렇고 승희도 그렇고 querySelectorAll의 0번째 인덱스로 접근하는 코드들이 있네요 ?!
궁금합니다아
addFilterBtns[0].className = "selected_button"; | ||
addFilterBtns[1].className = "unselected_button"; | ||
|
||
const tags = ["월급", "꽁돈"]; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
요 부분 이렇게 지정해두는 것 보다 HISTORY_LIST의 category랑 price 값으로 ('-'가 있으면 지출) 필터링해서 동적으로 생성할 수 있지 않을까요 ? 🤔
} | ||
} | ||
|
||
function handleAddSheet() { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
오호 모달 내용을 이렇게 처리했군요 !
if (option == "미정" || price === "" || data === "") { | ||
alert("모든 정보를 입력해주세요"); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
크으 예외처리 굿굿 👍🏻
? -price.replaceAll(",", "") | ||
: +price.replaceAll(",", ""); //지출일 경우, 가격 음수처리 | ||
historyList.push({ | ||
id: historyList[historyList.length - 1].id + 1, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
마지막 인덱스에 접근하고 싶다면 at()메소드를 사용해볼 수 있답니당
historyList.at(-1).id +1
이렇게!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
헉 너무 유익한 정보....😲🥹
addPrice.addEventListener("input", function () { | ||
addPrice.value = (+addPrice.value.replaceAll(",", "")).toLocaleString(); | ||
}); | ||
addPrice.addEventListener("keydown", function (e) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
오 keydown 이벤트 첨보네요 ?! 하나 또 알아갑니당
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
input에 이벤트핸들러를 사용하지 않고 keydown 이벤트를 사용할 수 있다는 걸 배워가요! keydown 이벤트 핸들러가 궁금해서 찾아보니까 숫자와 관련된 특수 키(Backspace, Delete, ArrowLeft, ArrowRight, Tab)를 허용한다는 장점이 있군요..!!
addPrice.value = (+addPrice.value.replaceAll(",", "")).toLocaleString(); | ||
}); | ||
addPrice.addEventListener("keydown", function (e) { | ||
if (e.key < "0" || e.key > "9") { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
오호 숫자가 아닌 값이 0보다 작고 9보다 큰가? 하고 찾아봤더니 아스키코드로 비교하나 보군요!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
과제하면서 진짜 이렇게 복잡한 방법으로 구현하는 방법밖에 없을까 많이 고민하는데, 승희언니 코드를 보면 진짜 그 답을 찾는것 같은 기분이 들어요! 코딩을 시작한지 얼마 안된 저도 읽기 쉽고 같은 기능인데도 다르게 구현한 코드들을 보면서 배우는게 정말 많은 것 같습니다... 이번 과제도 너무 고생 많았어용💕🥰
const li = document.createElement("li"); | ||
li.className = price < 0 ? "minus_item" : "plus_item"; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
저는 초기 데이터에 따로 변수를 하나 추가해서 minus, plus의 상태를 구분하고 해당 값들에다가 +, - 붙여서 사용하다보니까 코드가 정말 너무 복잡해졌는데... 이렇게 간단하면서도 명료한 방법이...😭 배워갑니다!!
|
||
// 모달 나타나는 효과 | ||
addSheet.style.display = "flex"; | ||
const addSheetModal = document.querySelectorAll("add_sheet")[0]; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
add_sheet 앞에 .이 없는것 같아요!
addPrice.addEventListener("input", function () { | ||
addPrice.value = (+addPrice.value.replaceAll(",", "")).toLocaleString(); | ||
}); | ||
addPrice.addEventListener("keydown", function (e) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
input에 이벤트핸들러를 사용하지 않고 keydown 이벤트를 사용할 수 있다는 걸 배워가요! keydown 이벤트 핸들러가 궁금해서 찾아보니까 숫자와 관련된 특수 키(Backspace, Delete, ArrowLeft, ArrowRight, Tab)를 허용한다는 장점이 있군요..!!
addFilterBtns[1].className = "selected_button"; | ||
addFilterBtns[0].className = "unselected_button"; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
저는 체크박스로 구현해서 체크박스에 입력된 값을 계속 갱신해줘야했는데 아예 button type으로 지정하니까 더 간단하게 구현할 수도 있네요!
? -price.replaceAll(",", "") | ||
: +price.replaceAll(",", ""); //지출일 경우, 가격 음수처리 | ||
historyList.push({ | ||
id: historyList[historyList.length - 1].id + 1, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
헉 너무 유익한 정보....😲🥹
✨ 구현 기능 명세
최초 데이터 ✔️
INIT_BALANCE
,HISTORY_LIST
데이터를 가집니다. (상수명은 자유) ✔️INIT_BALANCE
= 0HISTORY_LIST
: 입출금 내역 리스트 (4개
)→ 나의 자산은
INIT_BALANCE
로부터 4개의 입출금 내역 리스트를 반영하여 보여줍니다.총수입 / 총지출 ✔️
HISTORY_LIST
에 있는 수입 내역과 지출 내역을 계산해서 총수입, 총지출을 보여줍니다. ✔️수입/지출 필터링 ✔️
리스트 삭제 ✔️
X
버튼을 누르면 해당 리스트가 삭제됩니다. ✔️리스트 추가 ✔️
수입
지출
버튼 ✔️카테고리
를 선택 ✔️수입
을 선택하면 수입 관련된 항목들이,지출
을 선택하면 종류에 지출 관련된 항목들이 나옵니다.금액
과내용
입력 input ✔️저장하기
버튼 ✔️닫기
버튼 ✔️리스트 삭제 모달 ✔️
x
버튼 클릭시 삭제 모달이 나타납니다.→
예
클릭시 삭제를 진행합니다.→
취소
클릭시 모달이 사라집니다.리스트 추가 ✔️
alert
를 띄워 막습니다.alert
를 띄워 막습니다.모달 백그라운드 & 애니메이션 (삭제, 추가) ✔️
+
클릭시 추가 모달이 아래에서 위로 올라옵니다.카테고리 추가 ❌
Enter
키를 누르면 카테고리가 추가됩니다.금액 ✔️
,
로 표시됩니다. (나의 자산, 총수입/지출, 내역 리스트, 리스트 추가 input)💎 PR Point
상수 데이터는 다음과 같이 구조화하여 객체의 배열로 구현하였습니다.
각 객체에 삭제를 위해 ui에는 보이지 않는
id
속성을 추가하였습니다.handleFilter
를 실행하는 이벤트리스너를 추가합니다.그러나 해당 방식으로 구현했을 때, input 체크 여부를 동적으로 반영할 수 없는 문제에 봉착하였습니다.
(수입 버튼 클릭 시, 곧바로 checked 여부가 true가 되는 것이 아니라, 클릭한 순간에는 false로 찍히고 이후부터 true로 찍혀서 필터링도 한단계씩 지연되어 적용되는 문제)
따라서 이를 해결하고자 아래와 같이 각 checked 여부를 관리하는 flag 변수를 생성하여 관리해주었습니다.
handleDelete
를 실행하는 이벤트 리스너를 추가하였습니다.우선 하단의 추가 버튼에 이벤트 리스너를 달아
handleAddSheet
함수를 연결시켜줍니다.handleAddFilter
함수를 실행시킵니다🥺 소요 시간, 어려웠던 점
4h
🌈 구현 결과물
i.e.e.e.2023-10-27.i.i.8.15.36.mov
심화과제 구현 결과물은 과제 채점 후 추후 업로드하겠습니다