vue路由中间件

背景

在访问vue系统时,经常需要在进入路由前做一些全局处理或者登录状态校验,如果全部写在beforeEach函数中,内容会特别多,难以维护。需要将beforeEach中的内容拆分成多个中间件方法,按顺序执行。

步骤

1、注册中间件

注册需要的中间件文件,以修改页面标题和登录校验为例

router / middlewares / changeTitle.ts

export default async ({ to, next }: any) => {
  if (to.meta?.title) {
    // 修改页面title
    document.title = to.meta.title
  }
  next()
}

router / middlewares / auth.ts

export default async ({ to, next }: any) => {
  // 需要登录才能访问的页面path
  const needLoginPath = ['/about', '/orders', '/my-account']
  if (needLoginPath.includes(to.path) && !localStorage.getItem('token')) {
    // 访问需要登录的页面,并且没有登录状态,跳转登录页
    next('/login')
  } else {
    next()
  }
}

2、新建路由中间件执行文件

router / middlewarePipeLine.ts

function middlewarePipeline(context: any, middleware: any, index: any) {
  // 下一个中间件
  const nextMiddleware = middleware[index]
  // 如果中间件全部执行完毕,return next
  if (!nextMiddleware) {
    return context.originalNext
  }
  return () => {
    const nextPipeline = middlewarePipeline(context, middleware, index + 1)
    // 执行下一个中间件,并且重新赋值next
    nextMiddleware({ ...context, next: nextPipeline })
  }
}
export default middlewarePipeline

3、在路由配置文件router / index.ts添加中间件

import { createRouter, createWebHistory } from 'vue-router'

import changeTitle from './middlewares/changeTitle'
import auth from './middlewares/auth'
import middlewarePipeline from './middlewarePipeLine'

// 路由中间件,按数组顺序执行
const middlewares = [changeTitle, auth]

const router = createRouter({
  // ... 路由配置
})

router.beforeEach((to, from, next) => {
  // 创建上下文
  const context = { to, from, next, router, originalNext: next }
  // 将上下文信息传递进入到中间件里面去执行,刚开始先执行第一个中间件
  return middlewares[0]({
    ...context,
    next: middlewarePipeline(context, middlewares, 1)
  })
})

export default router

你可能感兴趣的:(vue,js,ts,vue.js,中间件,前端)