重生之我在学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.mzph.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;掌握基础协议原理、常…