Nuxt 使用指南:掌握 useNuxtApp 和運行時上下文

来源:https://www.cnblogs.com/Amd794/p/18314436
-Advertisement-
Play Games

title: Nuxt 使用指南:掌握 useNuxtApp 和運行時上下文 date: 2024/7/21 updated: 2024/7/21 author: cmdragon excerpt: 摘要:“Nuxt 使用指南:掌握 useNuxtApp 和運行時上下文”介紹了Nuxt 3中useN ...



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
  • 插件
  • 組件
  • 鉤子
  • 上下文

image
image

掃描二維碼關註或者微信搜一搜:編程智域 前端至全棧交流與成長

在 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

往期文章歸檔:


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ‍ 寫在開頭 點贊 + 收藏 學會 apk再見了,Android全新App安裝格式aab https://github.com/google/bundletool https://github.com/google/bundletool/releases https://deve ...
  • 適配原理 頂部導航欄和狀態欄沉浸實現比較簡單,設置Scaffold的AppBar背景色即可,其中surfaceTintColor可以設置IOS滑動之後狀態欄顏色,不想要顯示頂部導航欄高度設置toolbarHeight:0,陰影設置elevation: 0。 @override Widget buil ...
  • 當在UITableViewCell中載入網路圖片時,如果在圖片下載完成之前用戶滑動了UITableView,使得對應的UITableViewCell已經滑出屏幕,那麼這個被滑走的UITableViewCell是否還會顯示圖片,取決於如何處理圖片的載入和UITableViewCell的重用。 UITa ...
  • NSArray 是不可變的;存儲不同類型的對象。這意味著一個NSArray可以同時包含NSString、NSNumber、NSDictionary等不同類型的對象。同時只能存儲對象,不能直接存儲基本數據類型(如 int、float 等)。如果需要存儲基本數據類型,應該先將它們封裝為相應的對象類型(如 ...
  • Hello,小伙伴大家好,我是小VIE,一名學習前端時長兩月半的前端萌新 (ノ◡◝) 這次主要是分享我在前端兩個月的學習過程心得和半個月的實踐成果,希望無論是準備秋招的同學,還是日常中學習、工作、求職的小伙伴都能得到一些信心! ...
  • ‍ 寫在開頭 點贊 + 收藏 學會 引言 眾所周知,進度條是程式員大大模擬的程式運行進度,一般會在某些數值卡住不動,引起99%懸案。但是背後的原理你真的清楚嗎,其實進度條真的是勻速運動的! 先來看看效果 接下來開始實現 創建一個矩形,然後摺疊起來,完成! 創建一個容器,用於寬度限 ...
  • title: 使用 useNuxtData 進行高效的數據獲取與管理 date: 2024/7/22 updated: 2024/7/22 author: cmdragon excerpt: 深入講解了Nuxt 3中useNuxtData組合函數的應用,演示瞭如何通過此函數訪問緩存數據,實現組件間數 ...
  • 在寫vue3編譯原理揭秘電子書的時候,發現有不少粉絲還傻傻分不清楚什麼是編譯時?什麼是運行時?這篇文章我們來讓你徹底搞清楚編譯時和運行時的區別。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...