我对react 和表达有一点经验.我正在try 建立一个使用Socket io的聊天应用程序.我是第一次用它.但我想在看了一些文档和YouTube视频后,我有一点明白了.现在,当有人进入同一个房间时,他们可以交流.现在,假设我已经在房间里,有人加入了房间,然后我想看到那个人加入了房间,我成功地将其转化为逻辑,它起作用了.但是,当我进入房间时,我想向自己显示这样的信息:"您进入了房间",其他人会看到"我的名字进入了房间".我提出了逻辑,但不知何故,它并不起作用.我试着聊天,但我最终让他明白了其中的逻辑:/

我有一个名为App的父组件和两个名为Join的子组件,前者是加入聊天室的表单,后者是消息正文.我从Join到父应用程序中获取输入(姓名、房间),并将它们作为props 传递给消息.这是我的消息组件状态-->

this.state = {
      messages: [],
      inputMessage: "",
      joinedName: "",
      joinedRoom: "",
    };

这是一个组件Didmount生命周期,每当一个人发送和消息或加入房间时,它都会改变状态-->

componentDidMount() {
    const { room, name } = this.props;
    this.props.socket.emit("join-room", { room, name });
    this.props.socket.on("joined-room", (receivedName) => {
      this.setState({
        joinedName: receivedName,
        joinedRoom: receivedName === name ? "me" : "other",
      });
    });

    this.props.socket.on("receive-message", (newMessage) => {
      this.setState((prevState) => ({
        messages: [...prevState.messages, { content: newMessage, sender: "other" }],
      }));
    });
  }

为了了解更多信息,下面是我的服务器的相关部分-->

socket.on("join-room", (data) => {
        socket.join(data.room);
        socket.to(data.room).emit("joined-room",data.name)
    })

如你所见,每当有人进入房间时,我都会发送姓名和房间.并相应地更改状态,并且我正在判断我从服务器收到的名称是否是我之前从props 中提供的名称.如果是,那么房间就是我,否则就是其他的.然后,稍后我将使用joinedRoom状态来显示我或其他人是否进入了房间.以下是如何-->

{joinedName && (
            <div
              className={`bg-light-gray br3 rounded-lg pa2 mb2 self-end`}
              style={{
                color: "#fff",
                background: "rgb(148, 61, 255)",
              }}
            >
              <p className="ma0">
                {joinedRoom === "me" ? "You" : joinedName} joined the room
              </p>
            </div>
          )};

然后,如果有人加入房间,我将呈现此div.我正在签入p标记,无论它是不是我,并相应地呈现p标记,如您所见.

现在的问题是,当我加入房间时,我没有看到"您加入了房间"div.但当其他人进入房间时,我可以看到"圣名进入了房间".这里的缺陷是什么?

推荐答案

我解决了这个问题,我把答案贴在这里,这样万一其他人遇到这个问题,他们就不必像我一样挣扎了.在我的服务器中,我在加入房间的套接字中将加入的人的名字发送给房间里的每个人,除了通过下面这行代码进入房间的人

socket.to(data.room).emit("joined-room",data.name)

这是一个Socket.IO的事情,它将相应的数据发送给房间里的每个人,除了第一手发送数据的人.要将它发送给所有人,包括发送者,代码应该是这样的

io.to(data.room).emit("joined-room",data.name)

这会将数据发送给房间中的每个人,包括发送者本人:)

Reactjs相关问答推荐

如何使用react-router-dom导航到网页中的其他路由?

在一个blog函数中调用setState钩子

导致useState中断的中断模式

如何在与AntD的react 中限制文件上传和显示消息?

在每页上应用字体-NextJS

无法找出状态正在被更改的位置

GitHub页面配置

使用获取的数据更新状态,但在try console.log 时它给出未定义

React useContext 的未定义返回值

在 monorepo 内的工作区或库之间共享 redux 状态

当`useSelector`回调中的属性值更新时,将会使用更新后的值吗?

redux 工具包使用中间件构建器函数时,必须返回一个中间件数组

Formik onChange() 字段挂钩覆盖显示值和 Select 机制

Next.js i18n 路由不适用于动态路由

将 ref 转发到所有页面(路由组件)只是为了将其应用于
并具有跳过导航链接(按钮).有没有更好的办法?

Wordpress 插件在激活时创建一个 React Public 页面

无法读取未定义的react native 的属性参数

使用 react-router-dom 时弹出空白页面

getAttribute 函数并不总是检索属性值

MUI 卡组件上的文本未正确对齐