오늘도 여전히 친구에게 열혈 강의를 받은 내용을 기술해볼까 한다. 이번에 적어볼 기능은 Chip
인데, Chip은 아래의 이미지 처럼 생긴걸 Chip 이라고 한다고 한다.
얘는 TAB
버튼과 비슷한 방식으로 작동되는 아이인데, 누를 때마다 Checked 상태로 선택/비선택이 확실하게 표시된다고 해야하나? 페이스북 태그, 인스타 태그? 같은 거에도 쓰이고 여기 velog 에서도 태그 입력시 나오는 것도 Chip
이라고 할 수 있을 것 같다.
자 그럼 이제 본격적으로 적어보겠다.
한 두번 사용하지 않고 사용처마다 재활용을 할 것이기 때문에 일단 Component화를 해주었다. props 로는 무엇을 받아와서 써먹을 지 생각해야하는데 일단은 당장 필요한 걸로만 미리 만들어두었다.
ClassName 의 경우에는 만약 삼항연산자를 이용해서 className을 props로 받았을 경우와 받지 않았을 경우를 지정해놓고, 공통적인 클래스인 .chip 은 항상 들어가게 해두었다.
Chip의 모양은 한 가지가 아닌 두 개, 세 개이기 때문에 scale 이라는 Customer Props를 만들어주었고, Customer props 에는 data-
가 들어가야 된다고해서 key 값을 data-scale로 지정해주었다.
Chip
은 Checked 가 true
냐 false
냐에 따라서 상태가 바뀌어야 하기 때문에 Checked라는 props를 만들어주었고, 상태에 따라 css도 변하도록 해두었다.
onClick
이벤트를 통해서 Checked의 상태를 변화시켜야 하기 때문에 props를 만들어주었다.
text
는 Chip 안에 들어갈 Title 을 적어주기 위한 Props 이다.
best
로 주었다.내가 원하는 데이터를 띄워주기 위해 useEffect
와 fetch
함수를 이용해 목데이터에 대한 값을 받아올 것이다.
Chip이 클릭될 때마다 다른 데이터 리스트를 띄워주어야하기 때문에 삼항연사자를 이용해주었다. 아래의 이미지는 2가지의 경우가 있을 때만 사용할 수 있다는 것을 한번 더 강조한다.
내가 Chip이 onClick 될 때마다 currentChip의 데이터를 best
또는 giftBest
로 받아올 것이기 때문에 받아올 API주소를 url이라는 변수에 담아주었고, 조건이 만족된 API 주소를 이용해서 fetch 함수를 통해 주소에 맞는 데이터를 불러와 아까 미리 만들어놓은 bestData
useState에 데이터를 넣어주었다.
의존성 배열에는 currentChip이나 navigate의 상태가 변화될 떄마다 데이터를 새로 불러오도록 해주었다.
Chip
을 onClick 할 때마다 다른 값을 받아와야하기 때문에 Chip에 할당할 함수를 만들어주었다./:bestType
을 걸어서 /best/
에 bestType의 값이 들어오면 Best로 이동하도록 해주고, 만약 bestType의 값이 안들어오고 /best 로만 누군가가 접속하면 페이지가 안불러와지기 때문에 아래에 /best가 들어오면 navigete로 /best/best/
로 이동하도록 해주었다.chrecked의 상태값에 따라서 Chip의 현재 상태가 바뀌어야하기 때문에 currentChip 의 값에따라 true/false 를 받게해주고, onClick 함수에는 아까 만들어둔 onClickChip의 매개변수를 'best' or 'giftBest'로 넣어주어서 위의 동작들이 잘 되도록 해주었다.
실제로는 이렇게 진행하면 끝이긴하지만 다른 방식으로 로직을 업그레이드 하는 것도 이어서 적어보도록 하겠다.
굳이 수정하는 이유는 위의 상태로만 했을 때는
뒤로가기
를 눌렀을 때 완전 이전 화면으로 넘어가는 이슈와 best path 뒤에 이상한 값이 들어왔을 때 빈 화면이 보여지는 이슈가 있기 때문에 그것에 대해 버그를 잡기위해 수정하는 것이다.
best
가 자동으로 입력되도록 할당을 해준다.if문을 이용해서 params.bestType이 best
나 giftBest
가 아니라면 navigate함수를 이용하여 /best/best
로 이동하도록 해주고, replace를 이용해준다.
- replace는 이동 경로가 [ a, b, c ]로 이동할 때 a -> b -> c로 이동하는 것이 아닌 b -> c로 이동중에 replace가 발동하면 a -> c로 이동시켜준다.
- 이게 무슨 말이냐면 /
best/best
로 이동하는데 주소를 잘못치게 되면 histoty가 남게되어 뒤로가기를 누르면 잘못 쳤던 주소로 다시 갈 수 있는데, 이걸 방지해준다는 소리이다.- 잘못 쳤던 주소로 다시 돌아가지 않고, 그 부분을 건너뛴다는 소리이다.
currentChip의 값에 따라 url이 바뀌도록 그대로 설정해준다.
fetch를 이용해 API 주소에 있는 데이터를 가지고 오는데 params.bestType, navigate, currenChip의 상태가 변경될 때마다 데이터가 업데이트 되도록 해준다.
이후의 로직은 기존과 같다. 위의 처럼 로직을 수정함으로써 2개의 버그를 고칠 수 있었고, 친구에게 배우면서도 하나의 로직을 완성하기 위해서는 여러 케이스들을 생각해봐야 된다는 걸 한번 더 꺠달을 수 있었던 것 같다.