- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
上面的 img 显示了这个问题。你也可以检查右下角的控制台我正在使用 socket io react node 在一对一聊天网站上工作,表示我正面临这个问题,例如:当我第一次输入 hi 然后 hi 显示 1 次当我输入 hii 它在我第 3 次输入 jo 时显示 2 次显示 jo 3 次 我该如何解决这是我的 react 代码 另外我的消息未在另一端接收 它仅显示在发件人页面上
import React, { Component } from 'react';
import { Link,Redirect } from 'react-router-dom';
import UserService from "../services/userservice";
import {getUsersFriend} from "../services/messageservice";
import io from "socket.io-client";
const SOCKET_IO_URL = "http://localhost:4000/";
export default class Messages extends Component {
constructor(props){
super(props)
this.socket = io(SOCKET_IO_URL)
this.state = {
currentUser: UserService.getCurrentUser(),
isLoading:false,
userdetails:[],
show:false,
username:'',
message:'',
socketConnected:false,
messages:[]
};
this.onTextboxChangeMessage = this.onTextboxChangeMessage.bind(this)
}
componentDidMount(){
const {currentUser}=this.state
this.fetchUser()
this.socket.on('connect',()=> {
this.setState({ socketConnected : true})
// console.log("connection")
})
}
async fetchUser(){
try{
const {currentUser} = this.state
console.log(currentUser)
const data = { userid : currentUser.user._id }
console.log(data)
let user = await getUsersFriend(data)
this.setState({ userdetails: user });
// console.log(user)
}catch(err){
console.log(err)
}
}
showMessageSpace(elementusername){
this.setState({
show: true,
username:elementusername
});
}
onTextboxChangeMessage(e){
this.setState({ message:e.target.value})
}
SendMessage(e,senderid,receiverusername,message,senderusername){
e.preventDefault();
e.stopPropagation()
console.log('event', e)
const {messages} =this.state
if(this.state.socketConnected){
console.log('if condition test',senderid,receiverusername,message,senderusername )
this.socket.emit('send',{senderid,receiverusername,message,senderusername});
this.socket.on(`${receiverusername}`, (d)=>{
if(this.state[`${receiverusername}`]?.length >= 1 ){
let messageList = this.state[`${receiverusername}`]
this.setState({[`${receiverusername}`]:[...messageList,d]})
}
else{
this.setState({[`${receiverusername}`]:[d]})
console.log('else Condition store individual messages', this.state[`${receiverusername}`])
}
}
this.setState( { message:'' })
}
render(){
const { currentUser ,isLoading,userdetails,message,messages} = this.state;
// console.log(messages)
if (isLoading) {
return (<div><p>Loading...</p></div>);
}
if(!currentUser){
return(
<div>
<Redirect to='/login' />
</div>
)
}
else{
return(
<div>
<h1>Messages</h1>
<div>
<p>Users</p>
{' '}
<ul className="collection">
{userdetails.map((element) => {
return(
<div key={element._id}>
<li><Link to={`/dashboard/profile/:${element._id}`}>{element.username}</Link>{' '}<input
type="button"
id={element._id}
value="Message"
onClick={this.showMessageSpace.bind(this,element.username)} ></input></li>
</div>
);
})
}
</ul>
{' '}
</div>
{' '}
<Link to="/dashboard">Dashboard</Link>
{' '}
<div>
{
this.state.show &&
(<div>
<h2>Username : {' '}{this.state.username}</h2>
{' '}
<div>
<h3>Body</h3>
<div>
<ul>
{/* { this.state[`${this.state.username}`]?.map((msg,key) =>{ */}
{this.state.username?.length > 0 && this.state[`${this.state.username}`]?.map((msg,key) =>{
return(<li key={key}>{msg.senderusername}<span>{' '}{msg.message}</span></li>);
})
}
</ul>
</div>
</div>
{' '}
<div>
{' '}
<input
type="text"
name="message"
value={message}
onChange={this.onTextboxChangeMessage}
></input>
<button className='btn btn-info' onClick={(e)=> {this.SendMessage(e,currentUser.user._id,this.state.username,this.state.message,currentUser.user.username)}}>Send</button>
</div>
{' '}
</div>)
}
</div>
</div>
)
}
}
}
服务器代码:
io.on('connection', (socket) => { /* socket object may be used to send specific messages to the new connected client */
console.log('connection established',socket.id);
socket.on('send', (data)=>{
console.log("Receive data from single username",data)
io.emit('message',data)
socket.on('message',data => {
console.log("private")
io.to(data.receiverid).emit('message',data)
})
});
socket.on('disconnected',()=>{
console.log("disconnect")
})
});
最佳答案
这是因为每次发送消息时都会为套接字分配另一个新的回调。
移动这部分:
this.socket.on(`${receiverusername}`, (d)=>{
if(this.state[`${receiverusername}`]?.length >= 1 ){
let messageList = this.state[`${receiverusername}`]
this.setState({[`${receiverusername}`]:[...messageList,d]})
} else {
this.setState({[`${receiverusername}`]:[d]})
console.log('else Condition store individual messages',
this.state[`${receiverusername}`])
}
进入onconnect回调:
this.socket.on('connect',()=> {
this.setState({ socketConnected : true})
this.socket.on("message", (d)=>{
if(this.state[`${d.receiverusername}`]?.length >= 1 ){
let messageList = this.state[`${d.receiverusername}`]
this.setState({[`${receiverusername}`]:[...messageList,d.content]})
} else {
this.setState({[`${d.receiverusername}`]:[d.content]})
console.log('else Condition store individual messages',
this.state[`${receiverusername}`])
}
})
但在此变体中,您没有接收者用户名。所以你应该从你的服务器发送一般的“消息”事件作为包含接收者用户名的对象。
on 方法在 socket.io 文档中有准确的解释:https://socket.io/docs/v3/listening-to-events/
此处记录了在 onconnect 处理程序中分配 onmessage 回调的模式:
关于node.js - 每当我发送消息时,它都会在 react 中多次显示相同的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66612057/
SQLite、Content provider 和 Shared Preference 之间的所有已知区别。 但我想知道什么时候需要根据情况使用 SQLite 或 Content Provider 或
警告:我正在使用一个我无法完全控制的后端,所以我正在努力解决 Backbone 中的一些注意事项,这些注意事项可能在其他地方更好地解决......不幸的是,我别无选择,只能在这里处理它们! 所以,我的
我一整天都在挣扎。我的预输入搜索表达式与远程 json 数据完美配合。但是当我尝试使用相同的 json 数据作为预取数据时,建议为空。点击第一个标志后,我收到预定义消息“无法找到任何内容...”,结果
我正在制作一个模拟 NHL 选秀彩票的程序,其中屏幕右侧应该有一个 JTextField,并且在左侧绘制弹跳的选秀球。我创建了一个名为 Ball 的类,它实现了 Runnable,并在我的主 Draf
这个问题已经有答案了: How can I calculate a time span in Java and format the output? (18 个回答) 已关闭 9 年前。 这是我的代码
我有一个 ASP.NET Web API 应用程序在我的本地 IIS 实例上运行。 Web 应用程序配置有 CORS。我调用的 Web API 方法类似于: [POST("/API/{foo}/{ba
我将用户输入的时间和日期作为: DatePicker dp = (DatePicker) findViewById(R.id.datePicker); TimePicker tp = (TimePic
放宽“邻居”的标准是否足够,或者是否有其他标准行动可以采取? 最佳答案 如果所有相邻解决方案都是 Tabu,则听起来您的 Tabu 列表的大小太长或您的释放策略太严格。一个好的 Tabu 列表长度是
我正在阅读来自 cppreference 的代码示例: #include #include #include #include template void print_queue(T& q)
我快疯了,我试图理解工具提示的行为,但没有成功。 1. 第一个问题是当我尝试通过插件(按钮 1)在点击事件中使用它时 -> 如果您转到 Fiddle,您会在“内容”内看到该函数' 每次点击都会调用该属
我在功能组件中有以下代码: const [ folder, setFolder ] = useState([]); const folderData = useContext(FolderContex
我在使用预签名网址和 AFNetworking 3.0 从 S3 获取图像时遇到问题。我可以使用 NSMutableURLRequest 和 NSURLSession 获取图像,但是当我使用 AFHT
我正在使用 Oracle ojdbc 12 和 Java 8 处理 Oracle UCP 管理器的问题。当 UCP 池启动失败时,我希望关闭它创建的连接。 当池初始化期间遇到 ORA-02391:超过
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve
引用这个plunker: https://plnkr.co/edit/GWsbdDWVvBYNMqyxzlLY?p=preview 我在 styles.css 文件和 src/app.ts 文件中指定
为什么我的条形这么细?我尝试将宽度设置为 1,它们变得非常厚。我不知道还能尝试什么。默认厚度为 0.8,这是应该的样子吗? import matplotlib.pyplot as plt import
当我编写时,查询按预期执行: SELECT id, day2.count - day1.count AS diff FROM day1 NATURAL JOIN day2; 但我真正想要的是右连接。当
我有以下时间数据: 0 08/01/16 13:07:46,335437 1 18/02/16 08:40:40,565575 2 14/01/16 22:2
一些背景知识 -我的 NodeJS 服务器在端口 3001 上运行,我的 React 应用程序在端口 3000 上运行。我在 React 应用程序 package.json 中设置了一个代理来代理对端
我面临着一个愚蠢的问题。我试图在我的 Angular 应用程序中延迟加载我的图像,我已经尝试过这个2: 但是他们都设置了 src attr 而不是 data-src,我在这里遗漏了什么吗?保留 d
我是一名优秀的程序员,十分优秀!