質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.02%
Redux

Reduxは、JavaScriptアプリケーションの状態を管理するためのオープンソースライブラリです。ReactやAngularで一般的にユーザーインターフェイスの構築に利用されます。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

受付中

React + Redux でWebsocket 通信

tajihiro
tajihiro

総合スコア14

Redux

Reduxは、JavaScriptアプリケーションの状態を管理するためのオープンソースライブラリです。ReactやAngularで一般的にユーザーインターフェイスの構築に利用されます。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

1回答

0グッド

0クリップ

500閲覧

投稿2019/12/10 01:13

編集2019/12/10 02:46

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);

【質問事項】

  1. 画面内で使用する初期処理した socket や channel は、どこで初期化してどこで管理するのが良いでしょうか?
  2. サーバ側から受け取った Websocket は、どのように検知できるのでしょうか?

何かお気づきの点や知見等がございましたら、ご意見頂きたく願います。
以上、抽象的な質問となりますが、よろしくお願いします。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答1

0

redux-sagaを使って、middlewareからforkしたプロセス内の無限ループで実装するという方法が使えると思います。
参考:redux-sagaでwebsocketを使う

尚、上記の記事はredux-sagaが導入済みの前提で書かれているようなので、まだredux-sagaを導入していない場合はまず構築するところから進める必要があります。
Github - redux-saga

「redux-saga websocket」で検索するとサンプルが色々出てきますので、ご検討してみてください。

投稿2019/12/10 04:37

guissy-k

総合スコア245

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.02%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Redux

Reduxは、JavaScriptアプリケーションの状態を管理するためのオープンソースライブラリです。ReactやAngularで一般的にユーザーインターフェイスの構築に利用されます。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。