title: Nuxt 使用指南:掌握 useNuxtApp 和运行时上下文

date: 2024/7/21

updated: 2024/7/21

author: cmdragon

excerpt:

摘要:“Nuxt 使用指南:掌握 useNuxtApp 和运行时上下文”介绍了Nuxt 3中useNuxtApp的使用,包括访问Vue实例、运行时钩子、配置变量和SSR上下文。文章详细说明了provide和hook函数的应用,以及如何在插件和组件中利用这些功能。同时,探讨了vueApp属性、ssrContext和payload的使用场景,以及isHydrating和runWithContext方法的作用。

categories:

  • 前端开发

tags:

  • Nuxt3
  • VueJS
  • SSR
  • 插件
  • 组件
  • 钩子
  • 上下文



扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与成长

在 Nuxt 应用的开发过程中,useNuxtApp 是一个极其关键的内置可组合函数,它为开发者提供了访问 Nuxt 共享运行时上下文的重要途径。无论是在客户端还是服务器端,useNuxtApp 都发挥着不可或缺的作用。

什么是 useNuxtApp

useNuxtApp 是一个内置的组合式函数,它让你可以访问以下内容:

  • Vue 应用程序实例:你可以通过 useNuxtApp 获取全局的 Vue 应用程序实例,进而使用 Vue 的相关功能,如注册全局组件和指令等。
  • 运行时钩子:你可以使用 hook 方法来注册自定义的钩子,以便在特定的生命周期事件中执行代码。例如,你可以在页面开始渲染时执行某些操作。
  • 运行时配置变量:你可以访问 Nuxt 应用的配置变量,这些变量可以在应用的不同部分共享。
  • 内部状态:你可以访问与服务器端渲染(SSR)相关的上下文信息,如 ssrContext 和 payload。这些信息对于处理服务器端请求和响应非常重要。

使用示例

以下是如何在 Nuxt 应用中使用 useNuxtApp 的示例:

在插件中使用

// plugins/my-plugin.ts
export default defineNuxtPlugin((nuxtApp) => {
// 提供一个全局函数
nuxtApp.provide('greet', (name) => `Hello, ${name}!`); // 注册一个钩子
nuxtApp.hook('page:start', () => {
console.log('Page is starting...');
});
});

在组件中使用

<template>
<div>{{ greeting }}</div>
</template> <script setup>
const nuxtApp = useNuxtApp(); // 获取 nuxtApp 实例
const greeting = nuxtApp.$greet('World'); // 调用提供的函数
</script>

方法

provide 函数是 Nuxt.js 中用于扩展运行时上下文的一个重要功能。通过这个函数,你可以将值和辅助方法提供给 Nuxt 应用中的所有组合函数和组件,使它们能够共享这些值和方法。

1. provide 函数

provide 函数接受两个参数:

  • name:一个字符串,表示你要提供的值的名称。
  • value:你要提供的值或函数。

使用示例

以下是如何使用 provide 函数创建 Nuxt 插件并在应用中使用它的示例:

创建插件

首先,你需要创建一个插件文件,在其中使用 provide 函数:

// plugins/my-plugin.js
export default defineNuxtPlugin((nuxtApp) => {
// 使用 provide 函数提供一个自定义方法
nuxtApp.provide('hello', (name) => `Hello ${name}!`);
});

在组件中使用

接下来,你可以在任何组件中使用 useNuxtApp 来访问这个提供的方法:

<template>
<div>{{ greeting }}</div>
</template> <script setup>
const nuxtApp = useNuxtApp(); // 获取 nuxtApp 实例 // 调用提供的 hello 方法
const greeting = nuxtApp.$hello('World'); // 输出 "Hello World!"
</script>

在上面的示例中,$hello 成为 nuxtApp 上下文的一个新的自定义部分。你可以在任何可以访问 nuxtApp 的地方使用这个方法。

2. hook 函数

hook 函数用于在 Nuxt 应用的生命周期中注册钩子。它接受两个参数:

  • name:一个字符串,表示钩子的名称。
  • cb:一个回调函数,当钩子被触发时执行。

使用示例

以下是如何在 Nuxt 插件中使用 hook 函数的示例:

创建插件

你可以创建一个插件文件,并在其中使用 hook 函数来注册钩子。例如,下面的代码在页面开始渲染时和 Vue.js 发生错误时添加自定义逻辑:

// plugins/test.ts
export default defineNuxtPlugin((nuxtApp) => {
// 注册一个钩子,在页面开始渲染时触发
nuxtApp.hook('page:start', () => {
console.log('页面开始渲染');
// 在这里添加你的代码,例如记录日志、初始化状态等
}); // 注册一个钩子,当 Vue.js 发生错误时触发
nuxtApp.hook('vue:error', (..._args) => {
console.log('捕获到 Vue 错误:', ..._args);
// 可以在这里进行错误处理,例如发送错误报告
// if (process.client) {
// console.log(..._args);
// }
});
});

可用的运行时钩子

Nuxt.js 提供了一些内置的运行时钩子,你可以在应用中使用它们。以下是一些常用的钩子:

3. callHook 函数

callHook 函数接受两个参数:

  • name:一个字符串,表示要调用的钩子的名称。
  • ...args:可选的参数,可以传递给钩子的回调函数。

使用示例

以下是如何使用 callHook 函数的示例:

创建插件并调用钩子

假设你有一个插件需要在初始化时调用一个名为 my-plugin:init 的钩子,你可以这样实现:

// plugins/myPlugin.ts
export default defineNuxtPlugin((nuxtApp) => {
// 注册一个钩子
nuxtApp.hook('my-plugin:init', () => {
console.log('我的插件初始化钩子被调用');
// 在这里可以执行初始化逻辑
}); // 调用钩子
nuxtApp.callHook('my-plugin:init').then(() => {
console.log('钩子调用完成');
}).catch((error) => {
console.error('钩子调用出错:', error);
});
});

异步调用钩子

由于 callHook 返回一个 Promise,你可以使用 async/await 语法来简化异步调用的处理:

// plugins/myPlugin.ts
export default defineNuxtPlugin(async (nuxtApp) => {
// 注册一个钩子
nuxtApp.hook('my-plugin:init', () => {
console.log('我的插件初始化钩子被调用');
// 在这里可以执行初始化逻辑
}); // 使用 async/await 调用钩子
try {
await nuxtApp.callHook('my-plugin:init');
console.log('钩子调用完成');
} catch (error) {
console.error('钩子调用出错:', error);
}
});

属性

1. vueApp 属性

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

1.1 component()

  • 功能:注册全局组件或检索已注册的组件。

  • 用法

    • 注册组件:

      nuxtApp.vueApp.component('MyComponent', MyComponent);
      
      
    • 检索组件:

      const MyComponent = nuxtApp.vueApp.component('MyComponent');
      
      

1.2 directive()

  • 功能:注册全局自定义指令或检索已注册的指令。

  • 用法

    • 注册指令:

      nuxtApp.vueApp.directive('my-directive', {
      // 指令定义
      beforeMount(el, binding) {
      // 指令逻辑
      }
      });
    • 检索指令:

      const myDirective = nuxtApp.vueApp.directive('my-directive');
      
      

1.3 use()

1.4 使用示例

ssrContext 属性

1. url(字符串)

2. event(unjs/h3请求事件)

3. payload(对象)

4. 使用示例

payload

1. serverRendered(布尔值)

1. data(对象)

1. state(对象)

自定义类型和辅助函数

自定义负载插件示例

isHydrating

runWithContext

余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:编程智域 前端至全栈交流与成长,阅读完整的文章:Nuxt 3 使用指南:掌握 useNuxtApp 和运行时上下文 | cmdragon's Blog

往期文章归档:

Nuxt 使用指南:掌握 useNuxtApp 和运行时上下文的更多相关文章

  1. [源码解析] PyTorch 流水线并行实现 (3)--切分数据和运行时系统

    [源码解析] PyTorch 流水线并行实现 (3)--切分数据和运行时系统 目录 [源码解析] PyTorch 流水线并行实现 (3)--切分数据和运行时系统 0x00 摘要 0x01 分割小批次 ...

  2. vue.js2.0的独立构建和运行时构建

    转自:https://jingsam.github.io/2016/10/23/standalone-vs-runtime-only-build-in-vuejs2.html?utm_source=t ...

  3. 深入理解OOP(三):多态和继承(动态绑定和运行时多态)

    在前面的文章中,我们介绍了编译期多态.params关键字.实例化.base关键字等.本节我们来关注另外一种多态:运行时多态, 运行时多态也叫迟绑定. 深入理解OOP(一):多态和继承(初期绑定和编译时 ...

  4. so库链接和运行时选择哪个路径下的库?

    总结今天遇到的一个so库链接.运行问题. 这几天修改了xapian的源码,重新编译so库,再重新编译之前的demo程序,跑起来后却发现执行的函数并非我修改过的,使用的还是老版本.折腾了一会儿,发现是因 ...

  5. [转] Java 的泛型擦除和运行时泛型信息获取

    原文链接 https://my.oschina.net/lifany/blog/875769 前言 现在很多程序员都会在简历中写上精通 Java.但究竟怎样才算是精通 Java 呢?我觉得不仅要熟练掌 ...

  6. Vue.js 2.0 独立构建和运行时构建的区别

    Vue.js 2.0 独立构建和运行时构建的区别 在使用 Vue.js 2.0 时,有独立构建(standalone)和运行时构建(runtime-only)两种版本可供选择.而在 Vue.js 1. ...

  7. 查看系统中安装了那些dotnet core 的SDK和运行时的命令

    原文:查看系统中安装了那些dotnet core 的SDK和运行时的命令 1.查看SDK dotnet --list-sdks 2.查看运行时 dotnet --list-runtimes 效果如下图 ...

  8. Java编译时常量和运行时常量

    Java编译时常量和运行时常量 编译期常量指的就是程序在编译时就能确定这个常量的具体值. 非编译期常量就是程序在运行时才能确定常量的值,因此也称为运行时常量. 在Java中,编译期常量指的是用fina ...

  9. 代码编译时JDK版本和运行时JDK版本不一致启动项目报错

    java编译: java编译就是.java文件变成.class文件的过程,这个过程一般在我们常用的编译器中进行,例如Ecliplse和IDEA等:下面以IDEA举例: 执行上述编译使用的JDK版本就是 ...

  10. Java虚拟机系列一:一文搞懂 JVM 架构和运行时数据区

    前言 之前写博客一直比较随性,主题也很随意,就是想到什么写什么,对什么感兴趣就写什么.虽然写起来无拘无束,自在随意,但也带来了一些问题,每次写完一篇后就要去纠结下一篇到底写什么,看来选择太多也不是好事 ...

随机推荐

  1. minio 安装

    mybatis 相关:https://baomidou.com/pages/223848/#fieldfillhttps://mybatis-flex.com/zh/intro/maven.html ...

  2. WPF开发快速入门【4】自定义控件与用户控件

    概述 本文描述WPF的自定义控件和用户控件. 自定义控件 前面文章介绍了WPF的ControlTemplate,当我们对系统控件自带的样式不太满意时,我们可以通过控件模板自定义用户的样式,以Butto ...

  3. ubuntu安装之后要做的10件事

    部分内容整理自网络,如果侵权还请联系 基础配置 换源 换源 [ubuntu清华源镜像站] ctrl+click,进入镜像站链接,选择合适的版本,将镜像地址粘贴到本地文件里,对于: <24.04的 ...

  4. .NET C# 程序自动更新组件

    引言 本来博主想偷懒使用AutoUpdater.NET组件,但由于博主项目有些特殊性和它的功能过于多,于是博主自己实现一个轻量级独立自动更新组件,可稍作修改集成到大家自己项目中,比如:WPF/Winf ...

  5. Nacos 源码环境搭建

    最近在学习nacos,通过调式源码查看服务注册和发现流程和原理,本地部署naos源码需要一定的步骤,本文主要做nacos源码部署. nacos版本:2.1.1 下载源码 从github上下载源码到本地 ...

  6. 解决 Https 站点请求 Http 接口服务后报 the content must be served over HTTPS 错误的问题

    问题分析 之前将自己所有的 Http 站点全部更新为 Https 站点,但是在请求后台接口服务的时候还是 Http 请求,导致部署之后,直接在控制台报 This request has been bl ...

  7. vue3使用表格el-table-infinite-scroll.js:18 Uncaught (in promise) Error: [el-table-infinite-scroll]: .el-scrollbar__wrap element not found.

    先看下表格里面有没有这个el-scrollbar__wrap class类 没有的话升级一下element-plus到最新的就行 你可以先查看element-plus的版本 npm view elem ...

  8. 任意树遍历,可以使用 goto 跳记号标注的

    先顺序进入到最后一个根的根部,完后扫描同级 同级扫描完用 goto跳代码改层数到倒数地二层 之后操作就是倒着往上搜索的,有难度,但是还是能做到的嘛 用 lisit 好像不需要别的,全用 list 连接 ...

  9. Vue学习:10.v标签综合-进阶版

    再来一节v标签综合... 实例:水果购物车 实现功能: 显示水果列表:展示可供选择的水果列表,包括名称.价格等信息. 修改水果数量:允许用户在购物车中增加或减少水果的数量. 删除水果:允许用户从购物车 ...

  10. Docker入门系列之四:Docker镜像

    在本文中,您将学习如何加快Docker构建周期并创建轻量级镜像.遵循之前的文章中的食物隐喻,我们将沙拉隐喻为Docker镜像,同时减少Docker镜像的数量. 在本系列的第3部分中,我们介绍了十几个D ...