前端:利用生成器和迭代器实现分离逻辑

本文介绍了如何在前端项目中使用生成器和迭代器技术来实现逻辑分离,尤其是在处理动态权限菜单、路由管理和检索操作时。作者探讨了如何优化请求处理以避免数据混乱,确保用户体验的顺畅性。
摘要由CSDN通过智能技术生成

title: 前端:利用生成器和迭代器实现分离逻辑
date: 2024-03-05 23:31:12
categories: 前端
tags:

  • 前端
  • JavaScript

工作半年了常没时间、没动力学习新东西,每天就在忙着写业务逻辑,非常的枯燥。即使考虑到可以用新东西来实现某个需求,但为了保证业务的快速迭代,只能选择更稳妥的方式。

生成器和迭代器

今天完善一个需求,统一检索中,检索的各个实体tab依次弹出,实现类似RXJS弹珠图的效果。

class TabIterabor {
    constructor(
        private models: string[],
        private query: string,
        private index = 0
    ) {}
    // asyncIterator 标识是一个异步迭代器,next函数返回一个Promise对象
    [Symbol.asyncIterator]() {
        return {
    		next: async ()=> {
                return { value: null, done: true }
            }        
        }
    }
    // 可以使用生成器来构造自定义迭代器
    // https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Iterator/Iterator
    // *[Symbol.iterator]() {
    //   for (let value = this.#start; value <= this.#end; value += this.#step) {
    //     yield value;
    //   }
    // }
}

权限和菜单交互的设计

  • 隐藏菜单

    • 控制子菜单提升效果
    • 空权限时不允许登录
  • 不隐藏菜单,将指定的路由页面设置成404或者403页面

退出登录时应该要清空store和router的信息

封装hooks,增强router功能

import { Router, RouteRecordRaw } from "vue-router";

export const useExtRouter = (router: Router) => {
  /**
   * @function 退出登陆后,需要清空路由
   * @param {Router} router
   * @param {string[]} excludes name | path
   * @description
   * 在登录情况下,用户一定存在404路由用来显示不存在的或被过滤的路由页面,同时由于404路由应该放在异步路由后面
   * 所以在重置router时,需要清除404路由以避免后续添加异步路由时添加到404路由后面
   */
  const resetRouter = (excludes: string[]) => {
    const routes = router.getRoutes();
    routes.forEach((item) => {
      if (!excludes.find((x) => x === item.path || x === item.name)) {
        router.removeRoute(item.name as string);
      }
    });
  };

  /**
   * 删除嵌套路由
   * @param route
   */
  const deepDelete = (route: RouteRecordRaw) => {
    route.children?.forEach((item) => deepDelete(item));
    router.removeRoute(route.name as string);
  };

  /**
   * 添加嵌套路由
   * @param routes
   */
  const addRoutes = (routes: RouteRecordRaw[]) => {
    routes.forEach((item) => {
      deepDelete(item); // 避免重复添加路由
      router.addRoute(item);
    });
  };

  return {
    resetRouter,
    deepDelete,
    addRoutes,
  };
};

export default useExtRouter;

路由别名

在权限菜单的控制中,会存在前后登录的用户权限不一样导致可见的菜单不一样的问题。怎么动态的控制用户跳转的主页呢?

因为在404页面和登录成功后跳转都是 /,那就想到让 /跳转到 /home,在清洗权限路由(菜单)时,给找到的第一个有权限的路由标识路由别名,至此所有跳转到主页面 / 的都会跳转到 /home,而 /home 属于动态设置的路由别名,就可以动态的控制主页面了。

统一检索多个状态

tabs加载中,不允许输入新的query,也不允许发起新的query

tabs加载完成,第一个count非0的tab内容列表加载中,此时请求新query,加载新的tabs,此时上一次tabs中第一个count非0的tab请求完成,而当前tabs的第一个非0tab还没有发出请求(requestCount没有变化),所以会导致列表内容变化,展示不合理。

这个现象的主要问题在新tabs的第一个count非0的tab还没有发出请求,导致requestCount没有变化,所以达不到丢弃旧数据的效果。

解决方案:

不能简单的判断extTabLoading处于loading就丢弃数据,因为存在第一个Tab发出的请求快于extTabs的请求。

通过判断extTabs的请求次数来决定是否赋值。

因为此时count非0的tab已经发出请求,此时再发新extTabs的请求,然后再发count非0的tab请求,count非0的tab请求可能快于extTabs,所以不能简单将extLoading时的列表内容丢弃,可能丢弃的就是需要请求的内容。并且在新的tab发出请求后,旧tab发出的请求一定会被丢弃(requestCount)。

最终明确需要解决的问题时不同的extTabs请求,决定是否赋值数据。

GitHub

  • 16
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值