首页 > 其他分享 >nuxt3 全局性中间拦截注入的几种方式

nuxt3 全局性中间拦截注入的几种方式

时间:2025-01-07 21:54:46浏览次数:1  
标签:插件 nuxt3 全局性 plugins 中间件 nuxtApp 拦截 全局 页面

Nuxt 3 中,可以使用 全局钩子函数中间件插件 来实现一些全局性的逻辑或功能扩展。它们的使用场景和功能有所不同,下面将详细介绍这几种方式,并给出具体的使用示例。

1. 全局钩子函数

全局钩子函数是 Nuxt 3 提供的生命周期钩子,用于在不同阶段执行一些全局操作,例如应用创建、页面渲染、路由跳转等。

常见的全局钩子函数

  1. app:created: 在 Nuxt 应用创建时触发
  2. page:finish: 页面渲染完成时触发
  3. render:route: 渲染一个路由时触发
  4. route:before: 路由跳转之前触发
  5. error:handle: 全局错误处理
  6. build:before: 构建开始之前触发

全局钩子函数使用示例

通过 defineNuxtPlugin 在插件中注册全局钩子函数。

// plugins/global-hooks.js
export default defineNuxtPlugin(nuxtApp => {
  // 在 Nuxt 应用创建时触发
  nuxtApp.hook('app:created', () => {
    console.log('Nuxt app has been created')
  })

  // 在页面渲染完成时触发
  nuxtApp.hook('page:finish', () => {
    console.log('Page has finished rendering')
  })

  // 在路由跳转之前触发
  nuxtApp.hook('route:before', (to, from) => {
    console.log('Navigating to:', to.fullPath)
  })
})

nuxt.config.ts 中注册该插件:

// nuxt.config.ts
export default defineNuxtConfig({
  plugins: ['~/plugins/global-hooks.js']
})

2. 中间件 (Middleware)

中间件用于在路由进入前进行一些操作(如权限检查、数据预取等)。在 Nuxt 3 中,中间件可以分为两种类型:

  • 页面中间件:仅在特定页面或路由中使用。
  • 全局中间件:对所有页面或路由有效。

中间件使用示例

  1. 创建全局中间件

全局中间件在每个页面请求之前都会执行,可以用来进行权限验证、数据预取等操作。

// middleware/global.js
export default defineNuxtRouteMiddleware((to, from) => {
  const user = useState('user') // 假设用户信息存在state中
  if (!user.value) {
    return navigateTo('/login') // 如果没有登录,重定向到登录页
  }
})

然后在 nuxt.config.ts 中配置全局中间件:

// nuxt.config.ts
export default defineNuxtConfig({
  router: {
    middleware: ['global'] // 注册全局中间件
  }
})
  1. 创建页面级中间件

如果只想在某些页面中使用中间件,可以将其放在页面级的 middleware 中:

// pages/protected.vue
<script setup>
definePageMeta({
  middleware: 'global' // 仅在这个页面应用中间件
})
</script>

3. 插件 (Plugins)

插件用于扩展 Nuxt 3 的功能,可以用于注入全局变量、提供 API 或第三方库的实例等。插件在应用启动时就会加载,并且可以在整个应用中共享。

插件使用示例

  1. 创建插件

插件可以在 plugins/ 目录下创建,并通过 defineNuxtPlugin 定义。

// plugins/global-plugin.js
export default defineNuxtPlugin(nuxtApp => {
  // 注入一个全局变量
  nuxtApp.provide('globalVar', 'This is a global variable')

  // 注入一个方法
  nuxtApp.provide('globalMethod', () => {
    console.log('This is a global method')
  })
})
  1. nuxt.config.ts 中注册插件
// nuxt.config.ts
export default defineNuxtConfig({
  plugins: ['~/plugins/global-plugin.js']
})
  1. 在组件中使用插件提供的全局变量和方法

通过 useNuxtApp 获取插件中提供的变量和方法:

<template>
  <div>
    <p>{{ globalVar }}</p>
    <button @click="globalMethod">Call Global Method</button>
  </div>
</template>

<script setup>
const { globalVar, globalMethod } = useNuxtApp()
</script>

使用第三方库的插件

你也可以在插件中引入并使用第三方库,例如使用 axios 来进行全局请求:

// plugins/axios.js
import axios from 'axios'

export default defineNuxtPlugin(nuxtApp => {
  nuxtApp.provide('axios', axios)
})

在组件中使用 axios

<script setup>
const { axios } = useNuxtApp()

// 使用axios进行请求
const fetchData = async () => {
  const response = await axios.get('https://jsonplaceholder.typicode.com/posts')
  console.log(response.data)
}
</script>

4. 总结:全局钩子函数、中间件与插件的使用场景

  • 全局钩子函数:适用于在应用生命周期的特定时刻执行某些操作(如应用创建、页面渲染、路由跳转等)。
  • 中间件:用于在页面或路由请求前执行某些操作(如权限验证、重定向、数据预取等)。可以是全局的,也可以是页面级的。
  • 插件:用于扩展 Nuxt 3 的功能,例如注入全局变量、注册第三方库或提供公共方法。插件会在应用启动时加载,可以为整个应用提供共享的功能。

结合使用示例

如果你想要全局管理应用的权限和用户认证,你可以结合使用插件、全局钩子和中间件:

  1. 插件 用于提供一个全局的认证检查方法。
  2. 全局钩子 用于初始化应用时进行某些认证操作。
  3. 中间件 用于在每次路由跳转前检查用户是否登录。
// plugins/auth.js
export default defineNuxtPlugin(nuxtApp => {
  // 假设我们有一个全局的认证检查方法
  nuxtApp.provide('auth', {
    isAuthenticated: () => {
      return Boolean(localStorage.getItem('auth_token'))
    }
  })
})
// middleware/auth.js
export default defineNuxtRouteMiddleware((to, from) => {
  const { auth } = useNuxtApp()
  if (!auth.isAuthenticated()) {
    return navigateTo('/login') // 未认证,重定向到登录页
  }
})
// nuxt.config.ts
export default defineNuxtConfig({
  plugins: ['~/plugins/auth.js'],
  router: {
    middleware: ['auth']
  }
})

这种组合使用插件、钩子和中间件的方式可以有效地管理全局认证逻辑。

标签:插件,nuxt3,全局性,plugins,中间件,nuxtApp,拦截,全局,页面
From: https://www.cnblogs.com/jocongmin/p/18658444

相关文章

  • nuxt3 如何路由守卫
    在Nuxt3中,路由守卫(routeguards)可以帮助你在用户访问特定页面时进行拦截和处理,比如检查身份认证、授权,或者执行其他自定义逻辑。Nuxt3提供了几种方式来定义路由守卫,包括使用middleware和useRouterAPI。1.使用middleware实现路由守卫在Nuxt3中,路由守卫的推荐方式......
  • nuxt3 基本介绍
    Nuxt.js是一个基于Vue.js的框架,主要用于构建现代化的前端应用程序。它扩展了Vue.js,提供了服务器端渲染(SSR)、静态站点生成(SSG)、单页面应用(SPA)等多种模式。以下是Nuxt3的一些核心特点和常见用法,如果你有更具体的问题,欢迎补充!Nuxt3核心特点自动化路由生成Nuxt3根据......
  • nuxt3 父子组件通信有哪些方式
    在Nuxt3中,父子组件之间的通信方式和Vue3是一样的。父子组件通信的方式主要有以下几种:1.使用Props和Events(父子组件)这是Vue的基本通信方式,适用于父组件向子组件传递数据,或者子组件向父组件发送消息。父组件传递数据给子组件(Props)父组件通过props向子组件传递......
  • nuxt3 useFetch useAsyncData $fetch 区别
    1.useFetchuseFetch是一个用于获取数据的高层次工具,结合了useAsyncData和$fetch的功能,特别适用于需要与Nuxt3的服务器端渲染(SSR)集成的情况。特点:自动处理状态:useFetch会自动处理加载状态、错误状态以及数据缓存。SSR支持:它默认支持SSR,并会在服务器端预取数据。返......
  • nuxt3 使用pinia
    Pinia是Vue3官方推荐的状态管理库,替代了Vuex。在Nuxt3中,Pinia被很好地集成并支持,在官方文档中也明确推荐使用它来管理全局状态。如何在Nuxt3中使用Pinia以下是如何在Nuxt3项目中使用Pinia的步骤:1.安装Pinia首先,你需要安装Pinia:npminstallpinia2.在......
  • 如何把Android手机变成一个WIFI下载热点? — 报文转发及DNS报文拦截6
    随着WiFi的普及,移动运营商的热点也越来越多了,如中国移动的CMCC、中国电信的ChinaNet、中国联通的ChinaUnicom等,一般来说,连上此类的热点,打开浏览器上网时都会自动跳转到一个验证页面,最近有个项目也有类似的需求,Android手机自建热点,别的手机wifi连接此热点,打开浏览器,输入任意内容......
  • 如何把Android手机变成一个WIFI下载热点? — 报文转发及DNS报文拦截3
    随着WiFi的普及,移动运营商的热点也越来越多了,如中国移动的CMCC、中国电信的ChinaNet、中国联通的ChinaUnicom等,一般来说,连上此类的热点,打开浏览器上网时都会自动跳转到一个验证页面,最近有个项目也有类似的需求,Android手机自建热点,别的手机wifi连接此热点,打开浏览器,输入任意内容......
  • 如何把Android手机变成一个WIFI下载热点? — 报文转发及DNS报文拦截13
    随着WiFi的普及,移动运营商的热点也越来越多了,如中国移动的CMCC、中国电信的ChinaNet、中国联通的ChinaUnicom等,一般来说,连上此类的热点,打开浏览器上网时都会自动跳转到一个验证页面,最近有个项目也有类似的需求,Android手机自建热点,别的手机wifi连接此热点,打开浏览器,输入任意内容......
  • ArkWeb页面拦截与自定义响应 - 控制加载过程
    ArkWeb页面拦截与自定义响应-控制加载过程简介在Web应用开发中,有时我们需要对页面加载过程进行更精细的控制,比如拦截特定的请求并返回自定义的响应内容。ArkWeb框架提供了这样的能力,允许开发者拦截页面和资源加载请求,并自定义响应。本文将详细介绍如何使用ArkWeb框架实现这些......
  • 32. 过滤器和拦截器有什么区别
    1.实现原理不同过滤器和拦截器底层实现不同。过滤器是基于函数回调的,一般自定义的过滤器中都会实现一个doFilter()方法,这个方法有一个FilterChain参数,而实际上它是一个回调接口。拦截器是基于Java的反射机制(动态代理)实现的。2.触发时机不同过滤器Filter是在请求进入容器......