>components >chattignRoom>Footer.tsx
카톡 채팅방에서 전송 버튼이 있는 최하단 부분을 구현함. Footer 컴포넌트 하나와 Props 인터페이스 하나의 심플한 구성. Footer 을 export 한다.
그리고 위와 같은 리턴값을 가진다. 여기서는 import 해 온 외부 컴포넌트는 없는 것 같고, 해당 컴포넌트 안에 필요한 함수들은 다 정의 되어 있다. requestSubmit 험수는 onSubmit 과 onEnterPress 함수 내부에서 호출된다. 이때 한 가지 특징적인 것, 그리고 이 카톡 클론이 굉장히 구체적으로 구현되엇다고 느낀 부분은
위와 같이 조건문을 사용해서 엔터 키만 눌렀을 경우만 채팅 전송이 되게끔 했다는 점이었다.
>components >chattignRoom>Header.tsx
채팅방 상단에 채팅방 이름과 뒤로가기 버튼을 구현했다. props 인터페이스 하나와 Header 컴포넌트 하나로 구성되어 있으며 Header 를 디폴트로 export 중이다. 이 부분은 너무 간단해서, 자꾸 눈에 밟혔던 부분을 추가적으로 공부할 여유가 생겨
위 코드에 대해 공부를 해 보았다. 우선 FC 는 function component 의 준말.
[Typescript] FunctionComponent (FC) 사용 줄이기
React + Typescript 조합으로 개발을 하면서 자주 사용하는 타입 중 하나가 FC 이다. FC 는 FunctionComponent 타입의 줄임말로 리액트에서 함수형 컴포넌트의 타입을 선언할 때 사용할 수 있게 React 에서 제
woobiblog.com
여러 단점이 있어서 대부분 props 에 직접 타입을 선언해 주는 방식으로 진행한다. 그런데 여기서는 왜 .FC 를 많이 썼을지 의문.
>components >chattingRoom >InfoBlock.tsx
InfoBlock 이라는 파일명 답게 여러가지 정보를 알려주는 블록들을 저장해 둔 파일이다. 총 네 개의 컴포넌트를 export 하고 있고,
1. 날짜를 표시하는 등 채팅방의 경계를 나타내는 컴포넌트
2. 친구가 아닐 경우, 상단에 경고 창을 띄우는 컴포넌트
3. 채팅방의 스크롤이 일정 이상 올라가면 Down 버튼을 나타내는 컴포넌트
4. 채팅방의 스크롤이 일정 이상 올라가 있는 상태에서, 메시지가 도착하면 이를 알려주는 컴포넌트
그 기능들은 위와 같다. 이제 코드를 하나하나 살펴 보자.
1. 먼저, 날짜를 표시하는 등 채팅방의 경계를 나타내는 코드이다.
export const SeparationBlock: React.FC<SeparationBlockProps> = ({
보다시피 SeparationBlockProps 형식의 props 를 받아오는데, 이는 인터페이스로
이렇게 정의되어 있다. 이때 content 는
보다시피 ChatProps 형식이고, ChatProps 는
요렇게 생겻다. 즉 SeperationBlock 은 props 의 타입이 SeperationBlockProps 로 content:string 인데 props 로 받아온 것은 구조체 content 이다.. (여기서 하나 의문인 게 그럼 string 타입의 content 만 받아왔다는 것인지 아니면 ChatProps 전체를 다 받아왔다는 것인지 그도 아니면 구조체로 받아온 것을 string으로 타입변환 한 것인지 하는 것이다.. 이 문제는 일단 차치하고,, -> 완. es6 구조분해할당)
2. 친구가 아닐 경우, 상단에 경고 창을 띄우는 컴포넌트
우선 props 로 받아오는 것이 무엇인지부터 봐 보면,
를 받아오고 있고 (이 이름이 반드시 props 이름과 일치하지는 않아도 되는 것 같다.)
아 위 코드 보면서 이해 안되었던 것을 이 코드 보면서 이해를 했다. 구조분해 할당이라는 것에 대해 잠시 알아보고 넘어가자.
const {} = props es6 문법 구조분해할당(Destructuring assignment)이란
React Native에서 화면을 전환할때 파라미터를 전달하는 방법을 공부하던 중 아래와 같은 const { itemId } = route.parms란 문법을 보게 되었다. /*
sang12.co.kr
기존 js 문법에서는 구조체 안에서 특정한 하나의 변수를 지정하고 싶을 때 object.a 이런 식으로 썼는데 ES6 문법에서는 const {a} = object 라고 쓴다. 즉 위에서 해결 안되었던 문제의 답은 구조체 안의 string 타입을 갖는 content를 가져왔다 이다.
다시 돌아와서, NotFriendWarning 은 prop으로 onAddFriendClick 에 ondAddFreindClick 함수를 받아오고 있는데, 이 함수는 파라미터로 chatState.participant[0] 을 받아오고 있다.
이때 chatState 는,
이렇게 생겼고,
이므로, RootState 를 찾아보면,
요렇게 생겼다는 것을 알 수 있다. 그럼 rootState.chat 은 RootState 의 chat 을 의미하므로 다시 ChatState 를 찾아가 보면,
ChatState 는 요렇게 생겼다는 것을 알 수 있다.
onAddFriendClick(chatState.participant[0])
그럼 이 ChatState 의 첫번째 participant 를 onAddFriendClick 함수에 파라미터로 넘겨주었다는 얘기가 된다.
onAddFriendClick 함수를 봐 보자.
'코드리뷰' 카테고리의 다른 글
[카카오톡 클론코딩]2022.08.07 (0) | 2022.08.08 |
---|---|
[카카오톡 클론코딩]2022.08.06 (0) | 2022.08.07 |
[카카오톡 클론코딩]2022.08.05 (0) | 2022.08.06 |
[카카오톡 클론코딩]2022.08.03 (0) | 2022.08.03 |
코드리뷰 - 카카오톡 (0) | 2022.07.30 |
댓글