我正在尝试使用ReactJS
和Socket.io
在我的组件中,我希望能够与服务器通信,但问题是我不知道该怎么做io.connect()
1.我是否需要明确指定io.connect("http://myHost:7000")
这样的IP地址,或者说:io.connect()
是否足够?正如我们在这段代码中看到的那样:
https://github.com/DanialK/ReactJS-Realtime-Chat/blob/master/client/app.jsx
2.我与此代码大致相同,但在npm start
为io is undefined
时收到错误。我认为,io
是通过包含socket.io
脚本在全球范围内提供的。我怎么解决这个问题 ?
'use strict';
var React = require('react');
var socket = io.connect();
var chatWindow = React.createClass({
displayName: 'chatWindow',
propTypes: {},
getDefaultProps: function() {
return ({
messages: 0
});
},
componentDidMount: function() {
socket = this.props.io.connect();
socket.on('value', this._messageRecieve);
},
_messageRecieve: function(messages) {
this.setState({
messages: messages
});
},
getInitialState: function() {
return ({
messages: 0
});
},
_handleSend: function(){
var newValue = parseInt(this.refs.messageBox.value) + this.props.messages;
this.setState({
messages: newValue
});
socket.emit('clientMessage', { message: newValue});
},
render: function() {
var window =
<div>
<div>{this.props.messages}</div>
<input type="text" id="messageBox" refs="messageBox"></input>
<input type="button" onClick={this._handleSend} value="send" id="send"/>
</div>;
return (window);
}
});
module.exports = chatWindow;
这是代码:
答案 0 :(得分:4)
数目:
1)不,你不需要指定IP,你甚至可以使用/
它将通过默认的HTTP 80端口,无论如何,你可以在套接字上找到更多的例子。 io site。
2)也需要io
,请记得将socket.io-client添加到您的包裹中:
var React = require('react'),
io = require('socket.io-client');
无论如何,如果你想要将socket.io服务器提供的客户端脚本作为静态文件包含在内,那么请记住使用<script/>
标记将其添加到HTML中,这样你就可以<强大> io 在全球范围内避免了需求部分,但是,我更愿意要求它。
现在,关于......
尝试我的lib:https://www.npmjs.com/package/react-socket
它将在卸载时处理挂载和断开连接上的套接字连接(套接字事件监听器也是如此),试试看,让我知道。
这里有一个例子:
http://coma.github.io/react-socket/
var App = React.createClass({
getInitialState: function() {
return {
tweets: []
};
},
onTweet: function(tweet) {
var tweets = this
.state
.tweets
.slice();
tweet.url = 'https://twitter.com/' + tweet.user + '/status/' + tweet.id;
tweet.at = new Date(tweet.at);
tweet.avatar = {
backgroundImage: 'url(' + tweet.img + ')'
};
tweets.unshift(tweet);
this.setState({
tweets: tweets
});
},
renderTweet: function (tweet) {
return (
<li key={tweet.id}>
<a href={tweet.url} target="_blank">
<div className="user">
<div className="avatar" style={ tweet.avatar }/>
<div className="name">{ tweet.user }</div>
</div>
<div className="text">{ tweet.text }</div>
</a>
</li>
);
},
render: function () {
return (
<div>
<ReactSocket.Socket url="http://tweets.socket.io"/>
<ReactSocket.Event name="tweet" callback={ this.onTweet }/>
<ul className="tweets">{ this.state.tweets.map(this.renderTweet) }</ul>
</div>
);
}
});
React.render(<App/>, document.body);