【问题标题】:How to store an array of objects from server to client如何将对象数组从服务器存储到客户端
【发布时间】:2021-09-25 13:38:33
【问题描述】:

我们需要使用 ReactJS 将对象数组从服务器存储到客户端,但它不起作用。

所有这些都是为了在我的客户端显示用户连接,但我的用户列表状态并没有保存任何内容。

注意事项:

我正在使用这些技术:

  • NodeJS(服务器)
  • ReactJS(客户端)
  • socket.io

客户端代码

const [usersList, setUsersList] = useState([]);

  // get user connections data
  useEffect(() => {
    socket.on(ALL_USERS, ({ users }) => {
      console.log(users);
      setUsersList(users);
    });
  }, []);

  console.log("LIST: " + usersList);

服务器代码

 const users = getUsers(socket.id);
 socket.emit(constants.ALL_USERS, {
        users: users,
 });

【问题讨论】:

  • 这是怎么回事?
  • 我写console.log(usersList)的时候,不保存任何东西,只出现Object [object]
  • 显示的代码中没有任何地方你在这样做。 您向我们展示的代码以什么方式失败了?
  • 关于更新...我希望console.loguseEffect 之外执行两次。一次是在组件第一次渲染时,一次是在组件在状态更新后重新渲染时。在这两个渲染之间,值是否发生了变化?此外,不要这样做:console.log("LIST: " + usersList); 它几乎没有告诉您有关 usersList 的任何信息,因为您将其强制为字符串。相反,记录对象本身:console.log("LIST: ", usersList); 当你这样做时,在组件的两个渲染中具体记录了什么?

标签: javascript node.js arrays reactjs socket.io


【解决方案1】:

首先,不要这样做:

console.log("LIST: " + usersList);

这会将usersList 强制为一个字符串,它会从对象/数组中删除任何有用的信息。相反,记录对象本身:

console.log("LIST: ", usersList);

除此之外...您从控制台的屏幕截图非常有说服力。首先,这是记录:

LIST:

这意味着usersList 不包含任何内容。然后,在状态更新和组件重新渲染后,会记录下来:

LIST: [object Object]

这意味着usersList 现在包含一个对象。因此,尽管您断言它“不保存任何东西”,但您的调试输出清楚地表明它确实保存了一些东西。我怀疑它保存的正是服务器返回的内容:

{
    users: users,
}

服务器成功地返回了一个对象,并且您成功地将该对象存储在状态中。该代码正在运行,您自己的测试表明了这一点。


可能对数组和包含数组的对象之间的区别感到困惑。您最初将状态设置为空数组:

const [usersList, setUsersList] = useState([]);

但是在useEffect 操作中,您将其设置为从服务器返回的对象:

setUsersList(users);

也许您打算将其设置为该对象上的一个属性?:

setUsersList(users.users);

或者,或者,只从服务器返回数组本身:

socket.emit(constants.ALL_USERS, users);

【讨论】:

  • 很好,现在我更清楚发生了什么,谢谢,谢谢你
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-10
  • 2013-11-16
  • 1970-01-01
  • 1970-01-01
  • 2012-11-18
  • 2012-02-21
  • 1970-01-01
相关资源
最近更新 更多