重生之我在學Vue--第11天 Vue 3 高級特性

重生之我在學Vue–第11天 Vue 3 高級特性

文章目錄

  • 重生之我在學Vue--第11天 Vue 3 高級特性
    • 前言
    • 一、Teleport:打破組件層級的瞬移術
      • 1. 什么是Teleport?
      • 2. 核心用法
      • 3. 實戰技巧
    • 二、Suspense:異步組件的優雅過渡
      • 1. 為什么需要Suspense?
      • 2. 基礎結構
      • 3. 高級用法:錯誤捕獲
    • 三、自定義指令:打造專屬DOM魔法
      • 1. 指令生命周期
      • 2. 實現一個v-click-outside指令
      • 3. 指令參數解析
    • 四、今日任務與總結
      • 必做任務清單
      • 高頻面試題
      • 總結

前言

🚀 進階之路正式開啟!前10天我們完成了Vue3基礎體系搭建,今天將解鎖三大高階技能:Teleport瞬移組件Suspense異步邊界自定義指令魔法。這些特性能讓你的Vue應用擁有更強大的交互能力和性能表現!

Vue3 官方中文文檔傳送點: 簡介 | Vue.js

📌 今日重點文檔:

  • Teleport
  • Suspense
  • 自定義指令

Vue前端成仙之路:Vue 前端成仙之路_野生的程序媛的博客-CSDN博客

GO后端成神之路:Go 后端成神之路_野生的程序媛的博客-CSDN博客

一、Teleport:打破組件層級的瞬移術

1. 什么是Teleport?

解決組件嵌套導致的DOM結構問題,可以將組件內容渲染到任意DOM節點中。就像React的Portal,但更Vue!

經典場景
? 全局彈窗/模態框
? 全屏Loading
? 通知提示

2. 核心用法

<template><button @click="showModal = true">打開彈窗</button><Teleport to="body"><div v-if="showModal" class="modal"><h3>我是瞬移的彈窗</h3><button @click="showModal = false">關閉</button></div></Teleport>
</template>

關鍵點
? to屬性接收CSS選擇器或DOM元素
? 支持多個Teleport組件合并到同一目標節點

3. 實戰技巧

// 動態選擇目標節點
const target = computed(() => isMobile.value ? '#mobile-modal' : '#desktop-modal'
)
<Teleport :to="target"><!-- 內容 -->
</Teleport>

二、Suspense:異步組件的優雅過渡

1. 為什么需要Suspense?

處理異步組件加載時的等待狀態,提供統一的Loading和Error處理方案。

2. 基礎結構

<Suspense><!-- 異步組件 --><template #default><AsyncComponent /></template><!-- 加載狀態 --><template #fallback><div class="loading">加載中...</div></template>
</Suspense>

3. 高級用法:錯誤捕獲

<template><Suspense @resolve="onResolve" @pending="onPending" @fallback="onFallback"><!-- 組件內容 --></Suspense>
</template><script setup>
const onErrorCaptured = (err) => {console.error('異步組件加載失敗:', err)return true // 阻止錯誤繼續冒泡
}
</script>

三、自定義指令:打造專屬DOM魔法

1. 指令生命周期

鉤子函數觸發時機
created元素屬性初始化前
beforeMount元素掛載到DOM前
mounted元素掛載完成后
beforeUpdate組件更新前
updated組件更新后
beforeUnmount組件卸載前
unmounted組件卸載后

2. 實現一個v-click-outside指令

// directives/clickOutside.js
export default {beforeMount(el, binding) {el._clickOutside = (e) => {if (!el.contains(e.target)) {binding.value()}}document.addEventListener('click', el._clickOutside)},unmounted(el) {document.removeEventListener('click', el._clickOutside)}
}
<template><div v-click-outside="closeMenu"><!-- 下拉菜單內容 --></div>
</template>

3. 指令參數解析

// 使用方式:v-demo:arg.modifier="value"
{mounted(el, binding) {console.log(binding.arg)     // 'arg'console.log(binding.modifiers) // { modifier: true }console.log(binding.value)   // 綁定的值}
}

四、今日任務與總結

必做任務清單

  1. Teleport實踐
    ? 在項目中實現一個全局通知組件,要求:
    ? 從深層次組件觸發通知
    ? 通知顯示在頁面右上角固定位置

  2. Suspense挑戰
    ? 改造任務詳情頁:
    ? 使用異步組件加載詳情內容
    ? 添加骨架屏加載效果
    ? 處理接口加載失敗狀態

  3. 自定義指令開發
    ? 實現一個v-tooltip指令:
    ? 鼠標懸停時顯示提示文字
    ? 支持位置控制(上/下/左/右)
    ? 支持延遲顯示

高頻面試題

  1. Teleport組件能否和父組件通信?如何實現?

    答案
    Teleport 組件可以與父組件正常通信,因為它的邏輯作用域仍然屬于父組件,只是DOM 結構被渲染到其他位置。通信方式與普通組件完全一致:

    • Props 傳遞:父組件通過 props 向 Teleport 內的子組件傳值
    • 事件觸發:子組件通過 emit 觸發父組件的事件
    • 依賴注入:使用 provide/inject 跨層級通信
  2. Suspense是否可以捕獲子組件內的所有異步操作?
    答案
    Suspense ?只能捕獲以下兩種異步場景

    1. 異步組件加載defineAsyncComponent 加載的組件)
    2. 組件頂層 async setup()(組件 setup 函數返回 Promise)

    無法捕獲的場景

    • 子組件內的生命周期鉤子中的異步操作(如 onMounted 中的 setTimeout
    • 事件處理函數中的異步操作(如按鈕點擊后的 fetch 請求)
    • 非頂層 setup 中的異步邏輯

    解決方案
    對于其他異步場景,需自行實現 Loading 狀態(如使用 v-if + 加載狀態變量)。

  3. 自定義指令和組件的使用場景如何區分?

    答案

    核心區別

    自定義指令組件
    主要用途封裝DOM 操作行為封裝UI 和邏輯的可復用單元
    數據流通過指令值單向傳遞支持完整的 props/emit 數據流
    模板結構無模板,直接操作元素可包含模板、樣式和邏輯
    復用場景跨組件復用 DOM 交互行為復用帶有特定 UI 和功能的模塊

    使用場景對比

    • 適合指令的場景
      • 自動聚焦輸入框 (v-focus)
      • 點擊外部關閉菜單 (v-click-outside)
      • 滾動加載 (v-infinite-scroll)
    • 適合組件的場景
      • 帶樣式的模態框
      • 表單輸入控件(如日期選擇器)
      • 數據表格(含分頁、排序功能)

    經驗法則

    • 當需要直接操作 DOM添加全局行為時用指令
    • 當需要渲染復雜 UI 結構封裝獨立功能模塊時用組件

總結

特性核心價值應用場景
Teleport突破組件DOM層級限制全局彈窗/通知
Suspense統一管理異步加載狀態路由懶加載/數據預取
自定義指令直接操作DOM實現特殊交互點擊外部/滾動加載/動畫

明天預告:🚀 Vue 3 + TypeScript 類型系統深度整合

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/72347.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/72347.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/72347.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MCU的工作原理:嵌入式系統的控制核心

MCU的工作原理可以概括為以下幾個步驟&#xff1a; 1. 初始化 上電后&#xff0c;MCU從Flash存儲器中加載程序代碼&#xff0c;并初始化外設和寄存器。 2. 任務執行 根據程序邏輯&#xff0c;MCU執行數據處理、外設控制和通信等任務。通過中斷系統實時響應外部事件。 3. 低…

游戲引擎學習第158天

回顧和今天的計劃 我們在這里會實時編碼一個完整的游戲&#xff0c;沒有使用引擎或庫&#xff0c;一切都由我們自己做所有的編程工作&#xff0c;游戲中的每一部分&#xff0c;無論需要做什么&#xff0c;我們都親自實現&#xff0c;并展示如何完成這些任務。今天&#xff0c;…

k8s基礎架構介紹

k8s基礎架構介紹 k8s 是對容器進行編排的一種工具。通過k8s可以實現對容器的編排、部署、更新等 學習k8s之前&#xff0c;先了解相關的一些使用和配置k8s的一些工具。 k8s的常用工具 在 kubernetes 中&#xff0c;主要有三個日常使用的工具&#xff0c;這些工具使用 kube 前…

興達易控Profinet 轉 ModbusTCP跨網段通信模塊

Profinet 轉 ModbusTCP/跨網段通信模塊 Profinet轉ModbusTCP/跨網段通信模塊&#xff0c;作為現代工業自動化系統中不可或缺的重要組件&#xff0c;正日益受到廣泛關注和應用。 這種模塊的核心功能是將Profinet網絡協議轉換為Modbus TCP協議&#xff0c;實現不同網絡之間的無縫…

創新技術引領軟件供應鏈安全,助力數字中國建設

編者按 隨著數字化轉型的加速&#xff0c;針對軟件供應鏈的攻擊事件呈快速增長態勢&#xff0c;目前已成為網絡空間安全的焦點。如何將安全嵌入到軟件開發到運營的全流程&#xff0c;實現防護技術的自動化、一體化、智能化&#xff0c;成為技術領域追逐的熱點。 懸鏡安全作為…

某大廠自動化工程師面試題

一些大廠的自動化工程師面試題匯總: 基礎知識類 請解釋什么是PLC(可編程邏輯控制器)?什么是PID控制?它在自動化系統中的作用是什么?請描述一下工業4.0的基本概念。編程與控制系統類 你熟悉哪些PLC編程語言?請舉例說明。如何在SCADA系統中實現數據采集和監控?請解釋一下…

Java 大視界 -- 基于 Java 的大數據分布式數據庫架構設計與實踐(125)

&#x1f496;親愛的朋友們&#xff0c;熱烈歡迎來到 青云交的博客&#xff01;能與諸位在此相逢&#xff0c;我倍感榮幸。在這飛速更迭的時代&#xff0c;我們都渴望一方心靈凈土&#xff0c;而 我的博客 正是這樣溫暖的所在。這里為你呈上趣味與實用兼具的知識&#xff0c;也…

cursor中使用prettier-code formatter插件方法

cursor的"擴展"中搜索"prettier-code formatter"&#xff0c;然后安裝 點擊cursor編輯器右上角“更多操作”&#xff0c;然后打開“配置編輯器” 按照圖片進行操作&#xff0c;進入到editor在editor中&#xff0c;找“格式化“&#xff0c;把Format On Sav…

OSPF-2 鄰接建立關系

上一期我們說了OSPF的鄰居建立關系以及OSPF鄰居關系建立中建立失敗的因素以及相關實驗案例 這一期我們來說說OSPF的鄰接關系建立時需要交互哪些報文以及失敗因素及原因和相關實驗案例 一、概述 在運行了OSPF的網絡當中為了交互鏈路狀態信息和路由信息,互相之間需要建立鄰接關…

問deepseek: 如何處理CGNS網格文件里,多個zone之間的鏈接數據

在CGNS文件中&#xff0c;多個zone之間的鏈接數據通常通過ZoneGridConnectivity節點處理。以下是處理步驟&#xff1a; 1. 確定鏈接類型 首先&#xff0c;明確zone之間的鏈接類型&#xff0c;常見的有&#xff1a; 1-to-1連接&#xff1a;兩個zone的邊界點一一對應。** Over…

什么是SEO泛目(什么是SEO站群)

SEO泛目錄與站群策略&#xff1a;提升網站優化的雙劍合璧 在當今競爭激烈的互聯網環境中&#xff0c;SEO優化已成為企業提升網站流量和品牌曝光的重要手段。而在眾多SEO策略中&#xff0c;泛目錄和站群因其獨特的技術優勢和效果&#xff0c;逐漸成為SEO從業者的熱門選擇。本文…

conda、pip、npm、yarn換國內源

conda源 # conda源 conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/main/ conda config --set show_channel_urls yes# 換回conda的默認源 conda config --remove-key channels pip源 # pip源# 永久換源 pip config set global.index-url https://…

Jetson Orin NX jupyter lab的安裝和使用

主要是為了梳理一下整個過程&#xff0c;其實步驟很簡單&#xff0c;但容易出錯。 注意&#xff0c;實際只有兩個文件需要寫入&#xff0c;一個是jupyter_lab_config.py&#xff0c;一個是jupyter.service。 配置文件的名字要寫對&#xff0c;如果總是copy網上的代碼&#xff0…

【清華大學第七版】DeepSeek賦能家庭教育的實操案例(批改作文+輔助語文/數學/科學學習+制定學習計劃)

我用夸克網盤分享了「DeepSeek完整資料合集」&#xff0c;點擊鏈接即可保存。打開「夸克APP」&#xff0c;無需下載在線播放視頻&#xff0c;暢享原畫5倍速&#xff0c;支持電視投屏。 鏈接&#xff1a;https://pan.quark.cn/s/621259e4af15 近日&#xff0c;清華大學發布了《…

hive 中的各種參數,一般在哪里修改

在實際工作中&#xff0c;Hive 參數的配置和修改可以通過多種方式進行&#xff0c;具體取決于使用場景和需求。以下是常見的參數配置方式和適用場景&#xff1a; 1. 在 Hive CLI 或 Beeline 中臨時設置 適用場景: 臨時修改參數&#xff0c;僅對當前會話生效。 使用方法: 在 Hi…

Opencv之掩碼實現圖片摳圖

掩碼實現圖片摳圖 目錄 掩碼實現圖片摳圖1 掩碼1.1 概念1.2 創建掩碼1.3摳圖思路 2 代碼測試 1 掩碼 1.1 概念 掩碼&#xff08;Mask&#xff09;是一種用于指定圖像處理操作區域的工具。掩碼通常是一個與圖像尺寸相同的二值圖像&#xff0c;其中像素值為0表示不處理&#xff…

QT編程之JSON處理

一、核心類庫及功能 Qt 提供了一套完整的 JSON 處理類庫&#xff08;位于 QtCore 模塊&#xff09;&#xff0c;支持解析和生成 JSON 數據&#xff1a; ?QJsonDocument?&#xff1a;表示完整的 JSON 文檔&#xff0c;支持從 QJsonObject 或 QJsonArray 初始化?。?QJsonOb…

在虛擬環境里面配置Linux系統

Linux系統有很多版本&#xff0c;常用的有Ubantu烏班圖&#xff0c;和CentOS 不同的版本在使用的時候&#xff0c;有部分執行方式的不同 安裝的流程都一樣 首先&#xff0c;想要安裝Ubantu&#xff0c;要去它的官網&#xff0c;找下載連接&#xff0c;然后下載iso后綴的安裝…

CentOS7下安裝MongoDB

步驟 1&#xff1a;創建 MongoDB Yum 倉庫文件 你需要創建一個 MongoDB 的 Yum 倉庫配置文件&#xff0c;以便從官方源下載 MongoDB。打開終端并使用以下命令創建并編輯該文件&#xff1a; sudo vi /etc/yum.repos.d/mongodb-org-7.0.repo 在打開的文件中&#xff0c;輸入以下…

機器視覺工程師如何學習C#通訊

建議大家可以提前測試&#xff0c;真實模擬現場的情況&#xff0c;或者采用虛擬串口&#xff0c;虛擬網口頻繁測試通訊的穩定性&#xff0c;以后有現場需要&#xff0c;可以快速布局到現場。 機器視覺工程師學習C#通訊協議需要結合工業場景需求&#xff0c;掌握基礎協議原理、常…