当前位置: 首页 > 知识库问答 >
问题:

前端 - nextjs,如何不同路由之间共享数据?

柳飞鸾
2023-11-29

调用第三方接口获取的用户信息。我想保存下来。然后再提供个查询用户信息的接口。

class UserInfoStore {  userInfo: any = {    apps: [],  };  setUserInfo(newUserInfo: any) {    Object.keys(newUserInfo).forEach((key) => {      this.userInfo[key] = newUserInfo[key];    });    console.log('setUserInfo 2222', this.userInfo, this);  }  getUserInfo() {    console.log('getUserInfo 2222', this.userInfo, this);    return this.userInfo;  }}const userInfo = new UserInfoStore();export default userInfo;

然后我再获取的时候赋值。 userInfo.setUserInfo(userinfo);
然后再提供个get接口

import { NextApiRequest, NextApiResponse } from 'next';import userInfo from '@/stores/userInfoStore';const getUserInfoAPI = async (req: NextApiRequest, res: NextApiResponse) => {  const data = userInfo.getUserInfo();  console.log('getUserInfo', data);  const { appId } = req.body;  const apps = data?.apps || [];  if (apps.includes(appId)) {    res.status(200).json({      success: true,      data: data,      code: 200,    });  } else {    res.status(401).json({      success: false,      data: data,      code: 200,    });  }};export default getUserInfoAPI;

看着好像没问题。set的时候能打印到值。get的时候就没了。

共有1个答案

凤明朗
2023-11-29

从你提供的代码来看,UserInfoStore类的getUserInfo()方法返回的是this.userInfo,这是一个对象。在JavaScript中,对象是引用类型,不是值类型。这意味着当你将this.userInfo赋值给其他变量时,实际上是复制了引用,而不是对象本身。

在你的代码中,getUserInfoAPI函数中通过const data = userInfo.getUserInfo();获取到的data实际上是this.userInfo的一个副本。当你后续在getUserInfoAPI函数中对data进行操作时,不会影响到this.userInfo的值。

如果你希望在获取用户信息时能够改变this.userInfo的值,你需要返回一个新对象,而不是当前对象的引用。你可以通过返回Object.assign({}, this.userInfo)来实现这一点,这样你就可以在获取用户信息时保持对原始数据的引用,同时不会影响到原始数据。

以下是修改后的代码:

class UserInfoStore {  userInfo: any = {    apps: [],  };  setUserInfo(newUserInfo: any) {    Object.keys(newUserInfo).forEach((key) => {      this.userInfo[key] = newUserInfo[key];    });    console.log('setUserInfo 2222', this.userInfo, this);  }  getUserInfo() {    console.log('getUserInfo 2222', this.userInfo, this);    // 返回一个新对象,而不是当前对象的引用    return Object.assign({}, this.userInfo);  }}const userInfo = new UserInfoStore();export default userInfo;

然后你再获取的时候赋值。 userInfo.setUserInfo(userinfo);
然后再提供个get接口

import { NextApiRequest, NextApiResponse } from 'next';import userInfo from '@/stores/userInfoStore';const getUserInfoAPI = async (req: NextApiRequest, res: NextApiResponse) => {  const data = userInfo.getUserInfo();  console.log('getUserInfo', data);  const { appId } = req.body;  const apps = data?.apps || [];  if (apps.includes(appId)) {    res.status(200).json({      success: true,      data: data,      code: 200,    });  } else {    res.status(401).json({      success: false,      data: data,      code: 200,    });  }};export default getUserInfoAPI;
 类似资料:
  • 问题内容: 在Java中的各个类之间共享数据的最佳方法是什么?我有一堆变量,它们由不同的类以不同的方式在不同的文件中使用。让我尝试说明问题的简化版本: 这是我之前的代码: 现在看起来像这样: 所以无论如何,我应该每次都传递x和y(其中x,y是存储在辅助类func中的变量)吗? 我的想法是要有一个特殊的容器类,其中存放x和y。顶级类将具有容器类的实例,并使用set方法更改x,y。 我的帮助程序类还将

  • 问题内容: 我有以下问题。我编写了一个函数,该函数将列表作为输入并为列表中的每个元素创建一个字典。然后,我想将此字典追加到新列表中,以便获得字典列表。我正在尝试为此生成多个进程。我在这里的问题是,我希望不同的进程访问字典列表,因为它由其他进程更新,例如,一旦达到一定长度,就打印一些东西。 我的例子是这样的: 现在我的问题是每个过程都创建自己的过程。有没有一种方法可以在进程之间共享列表,以便所有字典

  • 问题内容: 我需要不同的类加载器才能卸载类。但是我需要在它们之间共享对象(实际上我正在获得ClassCastException)。那么解决该问题的解决方案是什么?谢谢 问题答案: 来自不同类加载器的对象可以通过公共类加载器加载的接口和类彼此交互。

  • 问题内容: 我想在两个兄弟Routes 和之间共享一个共享状态(远程获取客户端列表)。 我想尝试使用“纯” React(无Flux架构)可以走多远。 这个例子 可行,但是我有一个错误:所以,它似乎不喜欢异步道具。 是否可以将异步道具发送到每个路由? 还是可以在父路由(组件)中设置整个状态,然后从每个子路由(和组件)访问此状态? 问题答案: 您可以使用高级组件来提取数据并将数据注入到顶级组件。然后,

  • 我很想知道Hibernate二级缓存是否可以在运行在两个不同JVM上的两个不同Hibernate会话之间共享。 我正在使用Hibernate 3.1和Ehcache来提供二级缓存,并且在Ehcache中。xml配置文件我们可以指定在磁盘上创建缓存的位置 因此,如果我现在在不同的JVM中打开两个不同的Hibernate会话,它们都指向同一个JVM,那么这将允许我在两个JVM之间共享二级缓存。 如果是

  • 我需要使用BEHAT在不同类的步骤之间共享数据。类似于(在cucumber-jvm步骤之间传递变量的良好实践)PicoContainer for cucumber。有这样的框架吗?我知道我可以使用静态成员,但可能是一些框架。