React + Redux でWebsocket 通信を実装しようとしています。
質問としては、プログラム構成の質問です。
下記は一部割愛したソースコードです。
このページ内にて、ソケット通信初期処理⇒ソケット通信開始⇒イベント送信処理⇒ソケット受信処理を実行する流れなのですが、スコープの関係上どうしてもソケット受信処理を受け取る構成が取れません。当然、Reduxの設計を活かせたらと思っています。
Javascript
1import React, { Component } from 'react'; 2import { connect } from 'react-redux'; 3import { Link } from 'react-router-dom'; 4import { Socket } from 'phoenix'; 5 6//ソケット通信初期処理 7const socket = new Socket("/socket", {params: {token: window.userToken}}); 8socket.connect(); 9const channel = socket.channel("member:lobby", {}); 10 11//ソケット受信処理 12channel.on('new_message', state => { 13 console.log("ソケットデータ受信!!!" + state.body); 14}); 15 16 17class Sample extends Component{ 18 constructor(props) { 19 super(props); 20 this.state = { 21 data: [], 22 } 23 24 this.doEnterKey = this.doEnterKey.bind(this); 25 } 26 27 componentDidMount() { 28 //ソケット通信開始 29 channel.join() 30 .receive("ok", resp => { console.log("Joined successfully", resp) }) 31 .receive("error", resp => { console.log("Unable to join", resp) }) 32 } 33 34 //イベント送信処理 35 doEnterKey(e){ 36 if(e.keyCode === 13){ 37 console.log('Enter Key!!!' + e.target.value); 38 channel.push("new_message", {body: e.target.value}); 39 } 40 } 41 42 render() { 43 return ( 44 <div> 45 <div>Websocket</div> 46 <div id="messages"></div> 47 <input id="chat-input" type="text" onKeyDown={this.doEnterKey}></input> 48 <Link to={"/"}>戻る</Link> 49 </div> 50 ); 51 } 52} 53export default connect()(Sample);
【質問事項】
- 画面内で使用する初期処理した socket や channel は、どこで初期化してどこで管理するのが良いでしょうか?
- サーバ側から受け取った Websocket は、どのように検知できるのでしょうか?
何かお気づきの点や知見等がございましたら、ご意見頂きたく願います。
以上、抽象的な質問となりますが、よろしくお願いします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。