Vue3 特点

news2025/2/11 20:44:59

不强制要求组件有根节点

// vue2
<template>
  <div>
    <h1>标题</h1>
    <p>内容</p>
  </div>
</template>

// vue3
<template>
  <h1>标题</h1>
  <p>内容</p>
</template>

注意事项

虽然 Vue 3 不再强制要求根节点,但在某些情况下,你可能仍然需要使用一个包裹元素。例如:

  • CSS 样式:如果你需要对整个组件应用统一的样式,使用一个包裹元素会更方便。

  • 事件监听:如果你需要在组件级别添加事件监听器(如点击事件),使用一个包裹元素会更合适。

 props值使用

this.bannerData → props.bannerData

// Options API
props: {
  bannerData: {
    type: Object,
    default: () => ({})
  }
}
bannerDataComputed() {
  return {
    ...this.bannerData,
    json: BANNER_JSON
  }
}

//Composition API
const props = withDefaults(defineProps<{ bannerData: any }>(), {
    bannerData: ()=> ({})
})
const bannerDataComputed = computed(()=>{
    return {
        ...props.bannerData,
        json: BANNER_JSON
    }
})

computed值使用

this.bannerDataComputed → bannerDataComputed.value

// Options API
bannerDataComputed() {
   return {
     ...this.bannerData,
     json: BANNER_JSON
   }
},
staticData() {
  return this.bannerDataComputed.json || {}
},

// Composition API
const bannerDataComputed = computed(()=>{
    return {
        ...props.bannerData,
        json: BANNER_JSON
    }
})
const staticData = computed(()=>{
    return bannerDataComputed.value.json || {}
})

 methods编写

// Options API
methods: {
  jumpPage() {
    if (!this.bannerData?.jumpUrl) return
    this.$emit('jumpPage', this.bannerData.jumpUrl)
  }
}

// Composition API
const jumpPage = () => {
    if (!props.bannerData?.jumpUrl) return
    emit('jumpPage', props.bannerData.jumpUrl)
}

自动解析机制

在vue2中,父组件引入子组件,操作步骤如下:

  • 引入子组件
  • 注册子组件
  • 使用子组件

在vue3中,由于自动解析机制,可以省略显示注册子组件的需要,操作步骤如下:

  • 引入子组件
  • 使用子组件
// vue2
<BannerCard v-for="(item, idx) in cardList" :key="idx" :card-data="item" :index="idx" :static-data="staticData" />
import BannerCard from './BannerCard.vue'
components: {
  BannerCard
}

// vue3
<BannerCard v-for="(item, idx) in cardList" :key="idx" :card-data="item" :index="idx" :static-data="staticData" />
import BannerCard from './BannerCard.vue'

注意事项

虽然 Vue 3 的自动解析机制在大多数情况下可以正常工作,但在某些复杂场景下,显式注册组件仍然是推荐的做法。例如:

  • 组件名称冲突:如果多个组件的名称相同,自动解析机制可能会导致混淆。

  • 动态组件:如果你需要动态加载组件,显式注册会更加清晰和可控。

  • 代码可读性:显式注册组件可以提高代码的可读性和可维护性,特别是对于大型项目。

 emit

// Options API
jumpPage() {
  this.$emit('jumpPage', this.bannerData.jumpUrl)
}

// Composition API
const emit = defineEmits(['jumpPage']);

const jumpPage = () => {
    emit('jumpPage', this.bannerData.jumpUrl)
}

ref使用

// -----------Options API-------------
 <div ref="bannerContent" class="content"></div>
 mounted() {
  this.handleTouchMove = (e) => {
    e.stopPropagation()
  }
  this.handleTouchStart = (e) => {
    e.stopPropagation()
  }
  this.$refs.bannerContent.addEventListener('touchmove', this.handleTouchMove)
  this.$refs.bannerContent.addEventListener('touchstart', this.handleTouchStart)
 },
 beforeDestroy() {
  this.$refs.bannerContent.removeEventListener('touchmove', this.handleTouchMove)
  this.$refs.bannerContent.removeEventListener('touchstart', this.handleTouchStart)
 }

// --------------Composition API------------
<div ref="bannerContent" class="content"></div>
// 定义一个响应式引用,指向模板中的 bannerContent
const bannerContent = ref()
// 定义事件处理函数
const handleTouchMove = (e) => {
  e.stopPropagation()
}
const handleTouchStart = (e) => {
  e.stopPropagation()
}
onMounted(()=>{
    bannerContent.value.addEventListener('touchmove', handleTouchMove)
    bannerContent.value.addEventListener('touchstart', handleTouchStart)
})
onBeforeUnmount(()=>{
  bannerContent.value.removeEventListener('touchmove', handleTouchMove)
  bannerContent.value.removeEventListener('touchstart', handleTouchStart)
})

::v-deep

在 Vue 3 中,::v-deep 作为组合选择器已被弃用。你应该使用 :deep() 伪类选择器来替代它。这种变化主要是为了更好地与 CSS 标准保持一致,并且提供更清晰的语法。

beforeDestroy

在 Vue 3 中,生命周期钩子 beforeDestroy 已经被重命名为 beforeUnmount。这是为了更好地反映组件的生命周期阶段,并使命名更加一致。

  • Options API:直接使用 beforeUnmount
  • Composition API:使用 onBeforeUnmount

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2296504.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CTFHub-RCE系列wp

目录标题 引言什么是RCE漏洞 eval执行文件包含文件包含php://input读取源代码远程包含 命令注入无过滤过滤cat过滤空格过滤目录分隔符过滤运算符综合过滤练习 引言 题目共有如下类型 什么是RCE漏洞 RCE漏洞&#xff0c;全称是Remote Code Execution漏洞&#xff0c;翻译成中文…

从大规模恶意攻击 DeepSeek 事件看 AI 创新隐忧:安全可观测体系建设刻不容缓

作者&#xff1a;羿莉&#xff08;萧羿&#xff09; 全球出圈的中国大模型 DeepSeek 作为一款革命性的大型语言模型&#xff0c;以其卓越的自然语言处理能力和创新性成本控制引领行业前沿。该模型不仅在性能上媲美 OpenAI-o1&#xff0c;而且在推理模型的成本优化上实现了突破…

【学习笔记】企业数字化转型顶层设计与企业架构TOGAF9.2-第0章 导论

数据要素资产化迈入关键发展期 围绕发挥数据要素乘数作用&#xff0c;研究实施“数据要素x”行动:从供需两端发力&#xff0c;在智能制造、商贸流通、交通物流、金融服务、医疗健康等若干重点领域&#xff0c;加强场景需求牵引&#xff0c;打通流通障碍、提升供给质量&#xf…

SpringCloud - Sentinel服务保护

前言 该博客为Sentinel学习笔记&#xff0c;主要目的是为了帮助后期快速复习使用 学习视频&#xff1a;7小快速通关SpringCloud 辅助文档&#xff1a;SpringCloud快速通关 源码地址&#xff1a;cloud-demo 一、简介 官网&#xff1a;https://sentinelguard.io/zh-cn/index.h…

单片机上SPI和IIC的区别

SPI&#xff08;Serial Peripheral Interface&#xff09;和IC&#xff08;Inter-Integrated Circuit&#xff09;是两种常用的嵌入式外设通信协议&#xff0c;它们各有优缺点&#xff0c;适用于不同的场景。以下是它们的详细对比&#xff1a; — 1. 基本概念 SPI&#xff0…

03-DevOps-安装并初始化Gitlab

Gitlab可以理解为是自己搭建的GitHub&#xff0c;也就是自己的代码仓库。 开启macvlan 在192.168.1.10服务器上&#xff0c;构建Macvlan网络&#xff0c;这种网络模式可以为每个容器独立分配ip。 docker network create -d macvlan \--subnet192.168.1.0/24 \--ip-range192.16…

RabbitMQ 从入门到精通:从工作模式到集群部署实战(五)

#作者&#xff1a;闫乾苓 系列前几篇&#xff1a; 《RabbitMQ 从入门到精通&#xff1a;从工作模式到集群部署实战&#xff08;一&#xff09;》&#xff1a;link 《RabbitMQ 从入门到精通&#xff1a;从工作模式到集群部署实战&#xff08;二&#xff09;》&#xff1a; lin…

DFS+回溯+剪枝(深度优先搜索)——搜索算法

DFS也就是深度优先搜索&#xff0c;比如二叉树的前&#xff0c;中&#xff0c;后序遍历都属于DFS。其本质是递归&#xff0c;要学好DFS首先需要掌握递归。接下来咱们就一起来学习DFS涉及的算法。 一、递归 1.什么是递归&#xff1f; 递归可以这样理解把它拆分出来&#xff0…

使用PyCharm创建项目以及如何注释代码

创建好项目后会出现如下图所示的画面&#xff0c;我们可以通过在项目文件夹上点击鼠标右键&#xff0c;选择“New”菜单下的“Python File”来创建一个 Python 文件&#xff0c;在给文件命名时建议使用英文字母和下划线的组合&#xff0c;创建好的 Python 文件会自动打开&#…

Spring MVC 拦截器(Interceptor)与过滤器(Filter)的区别?

1、两者概述 拦截器&#xff08;Interceptor&#xff09;&#xff1a; 只会拦截那些被 Controller 或 RestController 标注的类中的方法处理的请求&#xff0c;也就是那些由 Spring MVC 调度的请求。过滤器&#xff08;Filter&#xff09;&#xff1a; 会拦截所有类型的 HTTP …

【零基础学Mysql】常用函数讲解,提升数据操作效率的利器

以耳倾听世间繁华&#xff0c;以语表达心中所想 大家好,我是whisperrrr. 前言&#xff1a; 大家好&#xff0c;我是你们的朋友whisrrr。在日常工作中&#xff0c;MySQL作为一款广泛使用的开源关系型数据库&#xff0c;其强大的功能为我们提供了便捷的数据存储和管理手段。而在…

防火墙安全综合实验

防火墙安全综合实验 一、拓扑信息 二、需求及配置 实验步骤 需求一&#xff1a;根据下表&#xff0c;完成相关配置 设备接口VLAN接口类型SW2GE0/0/2VLAN 10AccessGE0/0/3VLAN 20AccessGE0/0/1VLAN List&#xff1a;10 20Trunk 1、创建vlan10和vlan20 2、将接口划分到对应…

RabbitMQ 消息顺序性保证

方式一&#xff1a;Consumer设置exclusive 注意条件 作用于basic.consume不支持quorum queue 当同时有A、B两个消费者调用basic.consume方法消费&#xff0c;并将exclusive设置为true时&#xff0c;第二个消费者会抛出异常&#xff1a; com.rabbitmq.client.AlreadyClosedEx…

DeepSeek R1 简单指南:架构、训练、本地部署和硬件要求

DeepSeek R1 简单指南&#xff1a;架构、训练、本地部署和硬件要求 DeepSeek 的 LLM 推理新方法 DeepSeek 推出了一种创新方法&#xff0c;通过强化学习 (RL) 来提高大型语言模型 (LLM) 的推理能力&#xff0c;其最新论文 DeepSeek-R1 对此进行了详细介绍。这项研究代表了我们…

1.攻防世界 unserialize3(wakeup()魔术方法、反序列化工作原理)

进入题目页面如下 直接开审 <?php // 定义一个名为 xctf 的类 class xctf {// 声明一个公共属性 $flag&#xff0c;初始值为字符串 111public $flag 111;// 定义一个魔术方法 __wakeup()// 当对象被反序列化时&#xff0c;__wakeup() 方法会自动调用public function __wa…

【R语言】卡方检验

一、定义 卡方检验是用来检验样本观测次数与理论或总体次数之间差异性的推断性统计方法&#xff0c;其原理是比较观测值与理论值之间的差异。两者之间的差异越小&#xff0c;检验的结果越不容易达到显著水平&#xff1b;反之&#xff0c;检验结果越可能达到显著水平。 二、用…

2025.2.9机器学习笔记:PINN文献阅读

2025.2.9周报 文献阅读题目信息摘要Abstract创新点网络架构实验结论缺点以及后续展望 文献阅读 题目信息 题目&#xff1a; GPT-PINN:Generative Pre-Trained Physics-Informed Neural Networks toward non-intrusive Meta-learning of parametric PDEs期刊&#xff1a; Fini…

JVM(Java 虚拟机)

Java语言的解释性和编译性&#xff08;通过JVM 的执行引擎&#xff09; Java 代码&#xff08;.java 文件&#xff09;要先使用 javac 编译器编译为 .class 文件&#xff08;字节码&#xff09;&#xff0c;紧接着再通过JVM 的执行引擎&#xff08;Execution Engine&#xff09…

利用二分法进行 SQL 盲注

什么是sql注入&#xff1f; SQL 注入&#xff08;SQL Injection&#xff09;是一种常见的 Web 安全漏洞&#xff0c;攻击者可以通过构造恶意 SQL 语句来访问数据库中的敏感信息。在某些情况下&#xff0c;服务器不会直接返回查询结果&#xff0c;而是通过布尔值&#xff08;Tr…

大模型数据集全面整理:444个数据集下载地址

本文针对Datasets for Large Language Models: A Comprehensive Survey 中的 444 个数据集&#xff08;涵盖8种语言类别和32个领域&#xff09;进行完整下载地址整理收集。 2024-02-28&#xff0c;由杨刘、曹家欢、刘崇宇、丁凯、金连文等作者编写&#xff0c;深入探讨了大型语…