【React】单页面应用限制多开登录

react 单页面应用限制多开登录

情景

测试小姐姐提了一个 BUG : 在同一浏览器中打开两个页面,两个页面分别登录不同的账号.A 页面先登录A, B 页面再登录B,此时回到 A 页面,交互时账号数据应该刷新为 B 登录的账号

分析

这个问题,其实没什么必要,因为我不认为我们这个系统的单个使用者会同时拥有多个账号,但人家非说会有,那行吧,我说了不算,还是考虑解决问题吧。

React 也是 SPA 应用,在一个页面中变更数据并不会直接影响到另一个页面,所以我们得让我们的应用与某些全局共享的东西保持同步,比如站点在浏览器中的本地存储。欸,这不就来了嘛,用户登录的数据(token,基础信息等)我们往往会通过 localStorage 持久化存储在浏览器中,只需要监听存储在 localStorage 的用户数据变化即可同步我们的页面。

方案

  1. 在一个全局存在的组件中(如 Header,或者干脆 RootApp 等),监听 storage
  2. 绑定监听 storage 触发的函数,获取 localStorage 中的 userInfo(假设我们把登录成功后的用户数据全存在 userInfo 字段)
  3. 如果 userInfo 存在,更新 react 应用的状态中共享的用户数据,并强制刷新页面
  4. 如果 userInfo 没了,清空 react 应用的状态中共享的用户数据,并强制退出登录

伪代码

userManage.ts: 一些存取变更 localStorage 用户数据的封装

export default {
  state,
  login,  // 这个就是 localStorage.setItem("userInfo", val)
  logout, // 这个就是 localStorage.clear(); 和 window.location 重定向到登录页
  getUserInfo, // 这个就是尝试 localStorage.getItem("userInfo") 并反序列化
};

某个全局组件:

useEffect(() => {
  /** 监听 localStorage 的 userInfo 变化并同步 */
  async function syncUser() {
    const userInfo = localStorage.getItem('userInfo');
      if (userInfo) {
        userManage.login(JSON.parse(userInfo));
        window.location.reload();
      } else {
      	userManage.logout();
      }
    }
    window.addEventListener('storage', syncUser);
    return () => {
      window.removeEventListener('storage', syncUser);
    };
}, []);

这样就基本实现了多开限制,Bingo!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于使用 Umi 和 React 构建页面应用,可以按照以下步骤进行: 1. 安装 Umi:首先,确保你的项目已经安装了 Node.js,然后在命令行中运行以下命令来全局安装 Umi: ``` $ npm install -g umi ``` 2. 创建新项目:在命令行中进入你想要创建项目的目录,并运行以下命令来创建一个空的 Umi 项目: ``` $ mkdir my-app $ cd my-app $ umi init ``` 运行 `umi init` 命令后,会出现一个交互式的命令行界面,你可以根据自己的需求选择相应的选项(例如选择使用 TypeScript 或 JavaScript)来初始化项目。 3. 编写页面和组件:在 `src/pages` 目录下创建你的页面文件(例如 `index.tsx`),以及在 `src/components` 目录下创建你的组件文件。在这些文件中,你可以使用 React 来编写前端页面和组件的逻辑。 4. 配置路由:在 `config/config.ts` 文件中配置你的路由信息。你可以使用 Umi 提供的路由配置功能来定义不同路径下的页面。 5. 运行发服务器:在命令行中运行以下命令来启动发服务器,并在浏览器中查看你的应用程序: ``` $ umi dev ``` 运行成功后,你可以通过访问 `http://localhost:8000` 来查看你的应用程序。 这只是一个简的示例来帮助你始使用 Umi 和 React 构建页面应用。你可以根据自己的需求,进一步学习和使用 Umi 提供的其他功能和插件来发更复杂的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值