使用运行时上下文 useNuxtApp

是一个内置的可组合项,它提供了一种访问 Nuxt 的共享运行时上下文的方法,它在客户端和服务器端都可用

useNuxtApp

它可以帮助您访问 Vue 应用程序实例、运行时挂钩、运行时配置变量和内部状态,例如 ssrContextpayload

您可以在可组合项、插件和组件中使用 useNuxtApp()

app.vue
vue
<script setup>
const nuxtApp = useNuxtApp()
</script>

方法

provide (name, value)

nuxtApp 是一个运行时上下文,您可以使用 Nuxt 插件 对其进行扩展。 使用 provide 函数创建 Nuxt 插件,使值和辅助方法在您的 Nuxt 应用程序中跨所有可组合项和组件可用。

provide 函数接受 namevalue 参数。

示例:

js
const nuxtApp = useNuxtApp()
nuxtApp.provide('hello', name => `Hello ${name}!`)

// Prints "Hello name!"
console.log(nuxtApp.$hello('name'))

正如您在上面的示例中看到的,$hello 已成为 nuxtApp 上下文的新自定义部分,并且在可访问 nuxtApp 的所有地方都可用。

hook(name, cb)

nuxtApp 中可用的挂钩允许您自定义 Nuxt 应用程序的运行时方面。 您可以在 Vue.js 可组合项和 Nuxt 插件 中使用运行时挂钩来挂钩渲染生命周期。

hook 函数对于通过在特定点挂钩到渲染生命周期来添加自定义逻辑很有用。 hook 函数主要用于创建 Nuxt 插件。

有关 Nuxt 调用的可用运行时挂钩,请参阅 Runtime Hooks

plugins/test.ts
js
export default defineNuxtPlugin((nuxtApp) => {
  nuxtApp.hook('page:start', () => {
    /* your code goes here */
  })
  nuxtApp.hook('vue:error', (..._args) => {
    console.log('vue:error')
    // if (process.client) {
    //   console.log(..._args)
    // }
  })
})

callhook(name, ...args)

当使用任何现有挂钩调用时,callHook 会返回一个承诺。

js
await nuxtApp.callHook('my-plugin:init')

属性

useNuxtApp() 公开了以下属性,您可以使用这些属性来扩展和自定义您的应用程序以及共享状态、数据和变量。

vueApp

vueApp 是您可以通过 nuxtApp 访问的全局 Vue.js 应用程序实例。 一些有用的方法:

  • component() 是 Vue.js 提供的全局方法之一。如果同时传入一个名称字符串和组件定义,它会注册一个全局组件。如果只传递名称,则会检索已经注册的组件。这使得可以在应用程序的任何地方使用该组件,而不必在每个需要使用该组件的组件中进行导入。 vue中文档
  • directive() 方法可以用来注册全局自定义指令或者获取已经注册的指令,它接收一个指令名称和一个指令定义对象作为参数。如果只传递了指令名称示例,那么该方法将返回该名称对应的指令定义对象。 vue中文档
  • use() 安装一个Vue.js 插件 / 示例 / vue中文档

ssrContext

是在服务器端渲染时生成的,它只在服务器端可用。 Nuxt 通过以下方式暴露了以下属性

  • url(字符串)- 当前请求 url。
  • event(unjs/h3 请求事件)- 访问当前请求的 reqres 对象。
  • payload (object) - NuxtApp 有效载荷对象。

payload

payload 从服务器端向客户端公开数据和状态变量。 从服务器端传递后,以下密钥将在客户端可用:

  • serverRendered(布尔值)- 指示响应是否是服务器端呈现的。
  • data(对象)- 当您使用 useFetchuseAsyncData 从 API 端点获取数据时,可以从 payload.data 访问生成的有效负载。 此数据已缓存,可帮助您防止在多次发出相同请求的情况下获取相同的数据。
app.vue
vue
<script setup>
const { data } = await useAsyncData('count', () => $fetch('/api/count'))
</script>

在上面的示例中使用 useAsyncData 获取 count 的值后,如果您访问 payload.data ,您将看到那里记录了 { count: 1 } 。 每当页数增加时,count 的值就会更新。

ssrcontext 访问相同的 payload.data 时,您也可以在服务器端访问相同的值。

  • state (object) - 当您在 Nuxt 中使用 useState 可组合设置共享状态时,可以通过 payload.state.[name-of-your-state] 访问此状态数据。
plugins/my-plugin.ts
js
export const useColor = () => useState < string > ('color', () => 'pink')

export default defineNuxtPlugin((nuxtApp) => {
  if (process.server) {
    const color = useColor()
  }
})

通常 payload 必须只包含纯 JavaScript 对象。 但通过设置 experimental.renderJsonPayloads,可以使用更高级的类型,例如 refreactiveshallowRef``、shallowReactiveNuxtError

您还可以使用特殊的插件帮助程序添加自己的类型:

plugins/custom-payload.ts
ts
/**
 * 这种插件在 Nuxt 生命周期的早期运行,在我们恢复有效负载之前。
 * 您将无权访问路由器或其他 Nuxt 注入的属性。
 */
export default definePayloadPlugin((nuxtApp) => {
  definePayloadReducer('BlinkingText', data => data === '<blink>' && '_')
  definePayloadReviver('BlinkingText', () => '<blink>')
})

isHydrating

使用 nuxtApp.isHydrating(布尔值)检查 Nuxt 应用程序是否在客户端进行补水。

示例:

components/nuxt-error-boundary.ts
ts
export default defineComponent({
  setup(_props, { slots, emit }) {
    const nuxtApp = useNuxtApp()
    onErrorCaptured((err) => {
      if (process.client && !nuxtApp.isHydrating) {
        // ...
      }
    })
  }
})