Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- node.js
- JavaScript
- Elastic Beanstalk
- angular
- NeXT
- 카카오톡
- nextjs
- cors
- beanstalk
- react
- TypeScript
- angular4
- 알려줌
- Android
- hybrid
- swift
- fanzeel
- Route53
- 안드로이드
- AWS
- 웹뷰
- ios
- 감사일기
- 페이스북
- 네이티브
- https
- S3
- php
- 도메인
- node
Archives
- Today
- Total
쪼렙 as! 풀스택
React에서 Socket 연결을 Custom Hook 이용하여 구성해 보았다. 본문
웹 소켓을 이용하여 채팅 메시지를 보여줘야 할 필요가 있었는데,
React - Hooks 를 주로 사용하는 프로젝트에 붙여야 했다.
그냥 웹소켓에 연결하고 응답받는거야 그리 큰 어려움은 아니겠지만,
뭔 상태하나가 바뀌건, props 가 바뀌건, 시도때도없이 render 를 호출하는 리액트 hooks 에,
웹소켓 연결을 붙이는것은 고민이 좀 많이 되었었다.
그래서 이래저래 많은 시도를 해보았는데,
커스텀 훅을 만드들어서 해결한 방법이 가장 깔끔했고, 리액트 훅에 잘 어울린것 같다.
use-my-socket.ts
export enum MySocketState {
onNewChatReceived = 'onNewMessageReceived',
onConnectionFailed = 'onConnectionFaield',
onConnectionOpened = 'onConnectionOpened'
}
export const useMySocket = (
onConnectionStateChanged: (state: MySocketState) => void
) => {
//응답받은 문자열을 넘겨줄 state
const [responseMessage, setResponseMessage] = useState('')
// 연결을 시작한다.
useEffect(() => {
connectStart()
}, [])
//소켓 연결 시작.
const connectStart = () => {
const ws = new WebSocket(MY_HOST_NAME);
ws.onmessage = (e) => {
e.preventDefault();
const data = e.data;
setResponseMessage(data)
onConnectionStateChanged(MySocketState.onNewMessageReceived)
}
ws.onopen = () => {
onConnectionStateChanged(MySocketState.onConnectionOpened)
};
ws.onclose = () => {
onConnectionStateChanged(MySocketState.onConnectionFailed)
};
}
return {responseMessage: responseMessage}
}
useMySocket 을 사용할 React Component
import { useMySocket, MySocketState } from './use-my-socket';
export default MyComponent = () => {
const { responseMessage } = useMySocket((state) => {
if (state === MySocketState.onNewMessageReceived ) {
console.log('onNewMessageReceived');
}
else if (state === MySocketState.onConnectionFailed ) {
console.error('onConnectionFailed');
}
else if (state === MySocketState.onConnectionOpened) {
console.log('onConnectionOpened');
}
});
return (
<div>{responseMessage}</div>
)
}
'개발 일지 > Web & Server' 카테고리의 다른 글
Node.js - spawn - ffmpeg 이용하여, facebook, Instagram LIVE 에 영상 송출하기. (0) | 2021.01.31 |
---|---|
PHP 코드 수정이 바로 적용되지 않을 때, opcache disable 시키기. (0) | 2020.11.19 |
React - localhost 에서 cookie samesite 이슈 해결하기. (0) | 2020.09.06 |
안드로이드 하이브리드앱 웹뷰 WebView 에서 카카오톡 로그인 (앱) 사용하기 (2) | 2019.11.23 |
MySQL, 정렬한 기준으로 1:1로 Join 해서 데이터 가져오기. group by 안쓰고 해결;; (0) | 2019.09.03 |
Comments