카톡 채팅방에서 전송 버튼이 있는 최하단 부분을 구현함. Footer 컴포넌트 하나와 Props 인터페이스 하나의 심플한 구성. Footer 을 export 한다.
return (
<Wrapper>
<formonSubmit={onSubmit}>
<textarea
value={message}
autoFocus={true}
onChange={onMessageChange}
onKeyPress={onEnterPress}
/>
<buttonclassName={btnClassName}type="submit">
전송
</button>
</form>
</Wrapper>
);
그리고 위와 같은 리턴값을 가진다. 여기서는 import 해 온 외부 컴포넌트는 없는 것 같고, 해당 컴포넌트 안에 필요한 함수들은 다 정의 되어 있다. requestSubmit 험수는 onSubmit 과 onEnterPress 함수 내부에서 호출된다. 이때 한 가지 특징적인 것, 그리고 이 카톡 클론이 굉장히 구체적으로 구현되엇다고 느낀 부분은
요렇게 생겻다. 즉 SeperationBlock 은 props 의 타입이 SeperationBlockProps 로 content:string 인데 props 로 받아온 것은 구조체 content 이다.. (여기서 하나 의문인 게 그럼 string 타입의 content 만 받아왔다는 것인지 아니면 ChatProps 전체를 다 받아왔다는 것인지 그도 아니면 구조체로 받아온 것을 string으로 타입변환 한 것인지 하는 것이다.. 이 문제는 일단 차치하고,, -> 완. es6 구조분해할당)
기존 js 문법에서는 구조체 안에서 특정한 하나의 변수를 지정하고 싶을 때 object.a 이런 식으로 썼는데 ES6 문법에서는 const {a} = object 라고 쓴다. 즉 위에서 해결 안되었던 문제의 답은 구조체 안의 string 타입을 갖는 content를 가져왔다 이다.
다시 돌아와서, NotFriendWarning 은 prop으로 onAddFriendClick 에 ondAddFreindClick 함수를 받아오고 있는데, 이 함수는 파라미터로 chatState.participant[0] 을 받아오고 있다.
이때 chatState 는,
constchatState = props.rootState.chat;
이렇게 생겼고,
rootState: RootState;
이므로, RootState 를 찾아보면,
exportinterfaceRootState {
auth: AuthState;
user: UserState;
profile: ProfileState;
chat: ChatState;
}
요렇게 생겼다는 것을 알 수 있다. 그럼 rootState.chat 은 RootState 의 chat 을 의미하므로 다시 ChatState 를 찾아가 보면,
constinitialState: ChatState = {
room_id: -1,
type:undefined,
identifier:'',
room_name:'',
participant: [],
chatting: [],
last_read_chat_id: -1,
isChattingRoomShown:false,
isFetchChattingLoading:false
};
ChatState 는 요렇게 생겼다는 것을 알 수 있다.
onAddFriendClick(chatState.participant[0])
그럼 이 ChatState 의 첫번째 participant 를 onAddFriendClick 함수에 파라미터로 넘겨주었다는 얘기가 된다.
댓글