Kar*_*ran 24 node.js socket.io reactjs
我无法将SocketIO客户端整合到我的项目中,因为我让我的项目设置为同构的.在我的基本html中包含套接字文件之后,我尝试调用let socket = io();我的一个组件的componentdidmount,但是最初在我的控制台中记录后它是未定义的.当我路由到另一个组件并使用该套接字变量返回该组件时,它会填充一些数据.我想我的观点是,在我的组件中没有初始化什么套接字,似乎它必须等待我如何解决这个问题?
Component.jsx
componentDidMount() {
let socket = io();
console.log(socket);
}
Run Code Online (Sandbox Code Playgroud)
base.html文件
<!doctype html>
<html lang="">
<head>
<title>TITLE</title>
META
LINK
</head>
<div class="app">CONTENT</div>
<!-- Google Analytics: change UA-XXXXX-X to be your site's ID -->
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-XXXXX-X', 'auto');
ga('send', 'pageview');
</script>
<script type="text/javascript" charset="utf-8" src="/assets/app.js"></script>
<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io();
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
这工作正常,因为从服务器连接的东西,它发出用户连接和断开服务器,只是客户端操作让我感到困惑.
azi*_*ium 62
可能还有其他解决方案,但以下内容适用于我:
1)npm安装套接字客户端包
2)将套接字导入到需要套接字功能的所有组件的最根组件中
3)其中一个生命周期事件(constructor/ componentWillMount,componentDidMount)中的连接服务器端套接字事件监听器
4)如果有意义处理子组件中的某些服务器事件,则通过props传递套接字对象
例:
import io from 'socket.io-client'
let socket = io(`http://localhost:8000`)
class App extends Component {
state = { data: {} }
componentDidMount() {
socket.on(`server:event`, data => {
this.setState({ data })
})
}
sendMessage = message => {
socket.emit(`client:sendMessage`, message)
}
render () {
return (
<Child
socket = { socket }
sendMessage = { this.sendMessage }
/>
)
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20898 次 |
| 最近记录: |