보통 window.addEventListener 같은 것을 사용할 때 이벤트 파라미터에 대해서는 Event 타입을 사용하시고, 버튼 같은 클릭 이벤트 리스너의 이벤트 파라미터에 대해서는 SyntheticEvent 타입을 사용하시는 것 같습니다. 보통 클릭이라고 하면 MouseEvent<HTMLButtonElement> 또는 MouseEventHandler로 함수의 타입을 줄 수 있을 것 같은데 SyntheticEvent로 지정하시는 이유가 있으실까요. 대략적으로 SyntheticEvent가 여러 브라우저 등 호환성을 위해 React에서 자체적인 내장 인터페이스로 추상적으로 Vanilla JS의 Event 타입을 확장한 것으로 인지는 하고 있습니다.
gnb 를 이렇게 수정해 봤어여 https://github.com/hyunsokstar/challenge_gnb 부모 메뉴일 경우 토글 가능하도록 react 상태와 연동 https://github.com/hyunsokstar/challenge_gnb/blob/main/src/app/Component/ParentGnbItem.tsx zustand 로 현재 active 메뉴 관리 https://github.com/hyunsokstar/challenge_gnb/blob/main/src/app/Component/ChildGnbItem.tsx https://github.com/hyunsokstar/challenge_gnb/blob/main/src/app/%5B...item%5D/stores/isActiveLinkStore.ts 결과: 이렇게 수정한 방식도 괜찮을까여? 그리고 강의에서 src\app\[...item]\page.tsx 에서 url path를 얻어와서 Next Js 의 파일 기반 페이지 라우팅을 통째로 custom 하는 방식을 사용하는데 이런 방식은 Next Js에서 gnb 를 구현 하는 이상적 혹은 보편적인 방법 이라서인지 아니면 강의를 위한 제한적 구현인지 궁금합니다
classnames/bind 를 사용하지 않고, classnames를 사용할 때, typescript-plugin-css-modules 라는 것을 사용하면 위와 같이 현재 scss파일 안에 있는 클래스들이 보여지게 되는데요! classnames/bind 를 통해 cx를 만들어 사용할 때도 클래스들이 자동완성 됐으면 좋겠다고 생각이 들었습니다. 혹시 이것에 대한 방법이 있을까요?
안녕하세요! 알림 보고 바로 수강신청했습니다 ㅎㅎ 그런데 강의 자료를 열어보니 06_lazyLoading/4_r 이 쓰여지고는 있는데 폴더가 없네요... const LazyImage = dynamic(() => import('@/components/06_lazyLoading/4_r/lazyImage'), { ssr: false }) 실행도 못해보고 터져버린 앱... ㅠㅠ
04. Array 메소드 - (2 of 7) Filter ==================================== filter의 마지막 테스트 중 원하는 결과값이 나오지 않습니다. 강사님의 코드와 동일하게 작성하면 const tweetsPostedAfter10pm = posts.filter((post) => { const frenchTimestamp = new Date(post.meta.created_at).toLocaleString('fr-FR'); return new Date(frenchTimestamp).getHours() >= 22; }); //결과 // - Expected "5" // + Received "1" 이렇게 나옵니다. 저는 한국에 있으니 지역이 문제인 것 같아서 한국으로 설정하고 돌리면 const tweetsPostedAfter10pm = posts.filter((post) => { const koreanTimestamp = new Date(post.meta.created_at).toLocaleString('ko-KR'); return new Date(koreanTimestamp).getHours() >= 22; }); //결과 // - Expected "5" // + Received "0" 위처럼 나옵니다.. 콘솔로 데이터를 찍어보니 const tweetsPostedAfter10pm = posts.filter((post) => { const frenchTimestamp = new Date(post.meta.created_at).toLocaleString('fr-FR'); console.log(new Date(frenchTimestamp).getHours()); return new Date(frenchTimestamp).getHours() >= 22; }); //console 1 1 6 NaN NaN NaN 8 7 19 18 NaN NaN ... 참고로 ko-KR은 모두 NaN으로 나옵니다. 동일한 코드인데 왜 저는 이렇게 나오는 걸까요?? 오타라도 있는걸까요..? + 다른 코드로 해봤는데 9개가 나옵니다; const tweetsPostedAfter10pm = posts.filter((post) => { const date = new Date(post.meta.created_at); // UTC 시간을 한국 시간으로 변환 const koreanTime = new Intl.DateTimeFormat('ko-KR', { timeZone: 'Asia/Seoul', hour: '2-digit', hour12: false }).format(date); // '시' 부분만 추출 const koreanHour = koreanTime.split('시')[0]; const toNumber = koreanHour * 1; console.log(toNumber) return koreanHour >= 22;; }); //결과 // - Expected "5" // + Received "9" ++ 영상을 끝까지 보고나니까 오류가 있는게 맞는 것 같네요!? 저처럼 혼자 삽질하고 있을 학생들을 위해 남겨두겠습니다!
안녕하세요! 저는 시나브로님의 강의를 듣고 있는 학생입니다! 다름이 아니라 이전에 강의를 들었을 때에는 다소 난이도가 있어 미뤄두고 이번에 들었는데 조금 나아진 것 같습니다. 사실 아직 배포를 해본 경험이 없어 제 이해가 맞는지 여쭤보고 싶습니다. 배포를 위해서는 netlify나 vercel과 같은 호스팅 서비스를 이용하면 간편하게 진행할 수 있습니다(주변 분들께 궁금해서 여쭤보니, aws를 통해 좀 더 근간적으로 빌드와 배포를 진행할 수 있다는데 이 부분을 지금 공부하는 것이 좋을까요?) 시나브로님께서 강의에서 parcel과 vite를 이용해 빌드 & 번들하는 것을 보여주셨습니다. 두 방식 모두 특정 디렉토리에 소스 파일들을 작성하고, build 명령어를 통해 dist 디렉터리에 배포될 파일들을 생성합니다. 후에 vercel 같은 호스팅 서비스에서는 해당 프로젝트가 어떤 번들 툴로 만들어졌는지를 파악하고 서비스를 도와줍니다. 제가 추가적으로 chatGPT를 통해 알아보니 vite는 esbuild라는 트랜스파일링 & 번들을 동시에 해주는 내장 프로그램을 사용합니다. 이는 GO 언어로 작성되었기에 속도가 굉장히 빠릅니다. 기존의 CRA 프로젝트 같은 경우에는 babel 컴파일러와 webpack 번들러를 이용하지만, 이보다는 속도가 느릴 수 있습니다. tailwindCSS 라이브러리를 이용하여 문서의 스타일링을 진행하면 parcel이나 vercel 같은 프로그램이 이를 CDN을 통하여 관리해줍니다(이 부분이 개념이 다소 헷갈리는 것 같습니다). 사실 아직 실제로 해본 것이 아니라 개념이 헷갈립니다. 그래도 일단 강의를 한번 차례로 들으면 이해가 더 나아질까요? 감사합니다☺️
클로저에 대해서 어렴풋이 알고 있었지만, 막상 이벤트 핸들러 안에서 그것을 바라보니 조금 이해가 안되었는데요! 저처럼 아직 클로저가 익숙하지 않은 분들은 이벤트핸들러를 분리해서 보면 조금 더 이해가 쉽습니다! 그리고 디버거를 이용해서 스코프 안에 있는 변수들을 같이 보면 조금 더 이해가 되실거에요! 일단 클로저를 "어떤 함수가 선언될 때 외부 영역을 기억하는 것" 이라고 생각하고 이 코드를 바라보면 onHelloButtonHandler 라는 함수(이벤트핸들러) 가 선언될 때 myCardCount 의 값을 기억합니다. 즉, Add Card 를 할 때마다 + 1씩 올라간다고 하더라도 onelloButtonHandler 에게는 선언될 당시의 cardCount 를 myCardCount 로 받아서 기억하는 것이죠! 개발자 도구 우측에 Scope을 보면 onHelloButtonHandler 함수의 스코프체인을 볼 수 있는데요. myCardCount 가 로컬에 없기 때문에 그 위 스코프를 바라보는데요! 그 스코프가 바로 클로저이고! 저 클로저 스코프 안에 있는 myCardCount 라는 값은 이 함수가 선언될 당시의 값으로 정해집니다! 끝!!
02. 쇼핑몰 만들기 Part 1 - (3 of 7) Advanced event 4:50초쯤에 설명하시는 콘솔창에서 사용하는 $0 이, 현재 선택된 또는 클릭된 객체를 콘솔창에서 사용할때 $0으로 한다는 뭐 그런내용으로 설명하는 부분에서 저의 질문은 그렇다면 예를들어 let anyone = querySelectorAll('.sample') 처럼 같은 클래스가 여러개 존재하고 그 중의 하나를 선택하고자 할때 , 현재 클릭된 또는 선택되어 있는 ,콘솔창에 $0으로 접근하는 그것을 'this'라는 대명사(?)와 같은것인지 궁금합니다. 저는 this라는 것을 같은 것이 여러개 있을지라도 결국 어느 한순간에 실행되는 객체는 오직 하나이므로 (리얼 멀티프로세서가 아닌이상) 이것을 this로 생각 중..
안녕하세요. 우선 강의 자체에 대한 질문은 아닌데요. 강의 중간에 VS Code에서 " 로 감싸진 문자열을 ` 로 치환하는 장면이 종종 나오던데, 어떤 방법인지 궁금합니다. 왼쪽 하단에 보여지는 키보드 표시로는 cmd + ` 를 입력하면 작동하는거 같은데, VS Code의 확장 프로그램일까요? 그리고 하나 제보하자면, 정적 블로그 만들기 강의에서 6번에 7번 내용이 포함되어, 7번 Adding style 강의가 중복으로 재생됩니다.
https://learnwitheunjae.dev/api/sinabro-js/ecommerce 혹시나 치기 귀찮으신 분들이 있을꺼 같아 적어놓습니다. 그리고 크롬 사용하시는분들은 크롬 확장 프로그램의 JSONVue 을 검색하셔서 추가하시면 웹에서도 json 으로 format 으로 깔끔하게 보실 수 있습니다.