私はwebsocketを通じてサーバーとの通信を実装しようとしています。 Fluxや類似のライブラリを使用できないとします。私の問題は、サーバーの応答に関するデータを更新することです。Reactとwebsocket - データ操作
データを更新するためのサーバー応答でコールバック関数を実装する方法がわかりません。
これまでのところ、私はこのような何か(ない実際のコード)
events.js
const e = require('event-emitter');
var events = e();
module.exports = events;
socket.js
const events = require('./events');
module.exports = {
var ws;
init: function(URL) {
ws = new WebSocket(URL);
ws.onopen = function() { ... }
ws.onclose = function() { ... }
ws.onmessage = function(data) {
events.emit(data.action, data);
}
},
send: function(data) {
ws.send(data);
}
}
model.jsを持って
const events = require('./events')
var data = [];
/* listening for some specific event from socket */
events.on("action", doAction);
function doAction(data) {
events.push(data);
/* now I have to emit event which react component
is listening to so it can update data */
events.emit("viewAction");
}
}
/* what react component uses to get and render data */
module.exports = {
get:() => data,
events: events
}
component.js
const React = require('react');
const ReactDOM = require('react-dom')
const model = require('./model');
var App = React.createClass({
componentDidMount: function() {
model.events.on('viewAction', this.refresh);
},
componentWillUnmount: function() {
model.events.off('viewAction', this.refresh);
}
render: function() {
return (
<div>
{model.get()}
</div>
)
}
}
ReactDOM.render(
<App />,
document.getElementById('app')
);
私は、サンプルがそれを明確に私は何をしようとしていますし、何を私の問題があるになりたいと考えています。これはまた、モデル・イベント・リスナーが、それほどうれしくないリアクション・コンポーネントの1つに含まれていない限り動作しません。
良い方法がありますか?
オカイ...あなたのコンポーネントはどこですか? –
私は苦労している部分ではないので、コンポーネントを追加しませんでした。私の問題は、サーバーの応答にモデル更新を実装する方法に関するデータフローとベストプラクティスです。モデルの出力後、viewActionコンポーネントが期待通りに機能すると言うことができます。 – user3454914
まあ、フラックスでは、あなたのモデルは "店"と呼ばれるでしょう。コンポーネントは、ビューを再レンダリングするためにストアからの変更イベントを待機します。最良の方法は、モデルから放出されたイベントをコンポーネントが直接聞くことです。そのため、サンプルコンポーネントを含める必要があります。 –