【Vue3 入门到实战】16. Vue3 非兼容性改变
目录
1. 全局 API 的变化
2. 模板指令的变化
2.1 组件v-model用法
2.2 template v-for用法
2.3 v-if 和v-for 优先级变化
2.4 v-bind="object" 顺序敏感
2.5 v-on:event.native 被移除
3. 组件的变化
3.1 功能组件只能使用普通函数创建
3.2 SFC弃用功能属性
3.3 异步组件需要创建 defineAsyncComponent 方法
3.4 组件事件使用 emits 选项
4. 渲染函数的变化
4.1 渲染函数Api变化
4.2 删除 $scopedSlots 属性,并通过 $slots 将所有槽作为函数公开
4.3 $listeners 被删除/合并到$attrs
4.4 $attrs包括class和style属性
5. 总结
Vue 3 引入了许多改进和新特性,但同时也带来了一些与 Vue 2 不兼容的变化。以下是 Vue 3 中一些重要的非兼容性改变(参考官网)。地址链接如下👇 👇 👇
Breaking Changes | Vue 3 Migration Guide
1. 全局 API 的变化
全局 API 转移到应用实例:
在 Vue 3 中,许多全局 API 和选项被转移到了应用实例上。例如Vue.component、Vue.directive等现在需要通过创建的应用实例来使用。这意味着一些在 Vue 2 中直接挂载到全局 Vue 对象上的功能,现在需要通过应用实例(即 app 实例)来调用。
Vue 2 中的全局 API 使用方式
在 Vue 2 中,你可以直接使用全局的 Vue 对象来注册组件、指令、混入(mixins)、过滤器等。例如:
import Vue from 'vue';
import App from './App.vue';// 注册全局组件
Vue.component('my-component', {template: '<div>这是一个全局组件</div>'
});// 注册全局指令
Vue.directive('focus', {inserted(el) {el.focus();}
});// 创建并挂载应用实例
new Vue({render: h => h(App)
}).$mount('#app');
Vue 3 中的变化
在 Vue 3 中,这些全局 API 被移到了应用程序实例上,也就是说你需要先创建一个应用实例,然后在这个实例上调用相应的 API 方法。如下代码所示。
import { createApp } from 'vue';
import App from './App.vue';// 创建应用实例
const app = createApp(App);// 注册局部组件
app.component('my-component', {template: '<div>这是一个局部组件</div>'
});// 注册局部指令
app.directive('focus', {mounted(el) {el.focus();}
});// 挂载应用实例
app.mount('#app');
2. 模板指令的变化
2.1 组件v-model用法
Vue3重新设计了组件上的 v-model 用法,取代了 v-bind.sync。
在 Vue 3 中,v-model 的功能得到了扩展和改进,取代了 Vue 2 中的 .sync修饰符。这使得双向数据绑定更加灵活和直观。而且支持多个 v-model
绑定。还可以自定义事件名,默认是 update:modelValue
,但可以通过 v-model:propertyName
自定义。
Vue2种 .sync 修饰符
<!-- 父组件 -->
<template><div><child-component :money.sync="money" /></div>
</template><script>
export default {data() {return {money: 100};}
};
</script><!-- 子组件 -->
<template><div><button @click="$emit('update:money', 150)">修改银子</button></div>
</template>
Vue3种的 v-model
<!-- 父组件 -->
<template><div><child-component v-model:money="money" /></div>
</template><script setup>
import { ref } from 'vue';
const money = ref(100);
</script><!-- 子组件 -->
<template><div><button @click="$emit('update:money', 150)">修改银子</button></div>
</template>
2.2 template v-for用法
在 Vue 3 中,<template v-for>
上的 :key
属性需要放在 <template>
标签上,而不是内部的每个元素上。这样可以确保每个节点都有唯一的键,并且避免重复键的问题。
Vue2示例
<template><ul><template v-for="item in items"><li :key="item.id">{{ item.name }}</li><li :key="item.id + '_edit'">编辑 {{ item.name }}</li></template></ul>
</template>
Vue3示例
<template><ul><template v-for="item in items" :key="item.id"><li>{{ item.name }}</li><li>编辑 {{ item.name }}</li></template></ul>
</template>
2.3 v-if 和v-for 优先级变化
在 Vue 3 中,当 v-if
和 v-for
同时出现在一个元素上时,v-for
的优先级高于 v-if
。而在 Vue 2 中,v-if
的优先级更高。
v-for
的优先级更高,这意味着它会先执行循环,然后对每个元素应用 v-if
。
Vue2示例
<ul><li v-for="item in items" v-if="item.isVisible" :key="item.id">{{ item.name }}</li>
</ul>
Vue3示例
<ul><li v-for="item in items" :key="item.id" v-if="item.isVisible">{{ item.name }}</li>
</ul>
2.4 v-bind="object"
顺序敏感
在 Vue 3 中,v-bind="object"
是顺序敏感的,这意味着对象中的属性顺序会影响最终的结果。如果对象中有相同的属性(例如多次绑定 class
),后面的值会覆盖前面的值。因此,你需要确保对象中的属性顺序符合预期。
2.5 v-on:event.native
被移除
在 Vue 3 中,v-on:event.native
修饰符被移除。这是因为自定义组件现在默认监听原生事件,不再需要 .native
修饰符。
Vue2示例
<template><custom-component @click.native="handleClick"></custom-component>
</template>
Vue3示例
<template><custom-component @click="handleClick"></custom-component>
</template>
3. 组件的变化
3.1 功能组件只能使用普通函数创建
在 Vue 3 中,功能组件(Functional Components)的概念有所变化。Vue 2 中的功能组件可以通过 functional: true
选项来定义,而在 Vue 3 中,功能组件只能通过普通的函数来创建。
也就是在 Vue 3 中,功能组件不再支持 functional: true
选项,功能组件必须通过返回渲染函数(如 h
函数)的方式实现。
Vue2示例
<template functional><div>{{ props.message }}</div>
</template><script>
export default {functional: true,props: {message: String}
};
</script>
Vue3示例
在 Vue 3 中,功能组件需要使用 defineComponent
和普通函数来定义:
import { defineComponent, h } from 'vue';const FunctionalComponent = defineComponent({props: {message: String},setup(props) {return () => h('div', props.message);}
});
3.2 SFC弃用功能属性
在 Vue 3 中,单文件组件(SFC)中的 <template>
标签不再支持 functional
属性。这意味着你不能像在 Vue 2 中那样直接在 <template>
标签上添加 functional
属性来定义功能组件。
Vue2示例
<template functional><div>{{ props.message }}</div>
</template><script>
export default {props: {message: String}
};
</script>
Vue3示例
在 Vue 3 中,你需要将功能组件逻辑移到 setup
函数中,并且不能再在 <template>
标签上使用 functional
属性。
<template><div>{{ message }}</div>
</template><script setup>
import { defineProps } from 'vue';const props = defineProps({message: String
});
</script>
3.3 异步组件需要创建 defineAsyncComponent
方法
在 Vue 3 中,异步组件的创建方式发生了变化。你需要使用 defineAsyncComponent
方法来定义异步组件,而不是像 Vue 2 中那样直接返回一个 Promise。
Vue2示例
const AsyncComponent = () => import('./AsyncComponent.vue');
Vue3示例
import { defineAsyncComponent } from 'vue';const AsyncComponent = defineAsyncComponent(() => import('./AsyncComponent.vue'));
种方式提供了更多的配置选项,比如加载状态、错误处理等。如:
const AsyncComponent = defineAsyncComponent({loader: () => import('./AsyncComponent.vue'),loadingComponent: LoadingComponent,errorComponent: ErrorComponent,delay: 200,timeout: 3000
});
3.4 组件事件使用 emits
选项
在 Vue 3 中,组件事件的声明更加明确,推荐使用 emits
选项来显式声明组件可以触发的事件。这有助于提高代码的可读性和维护性。
Vue2示例
<template><button @click="handleClick">点击我</button>
</template><script>
export default {methods: {handleClick() {this.$emit('custom-event', 'some data');}}
};
</script>
Vue3示例
<template><button @click="handleClick">点击我</button>
</template><script setup>
import { defineEmits } from 'vue';const emit = defineEmits(['custom-event']);function handleClick() {emit('custom-event', 'some data');
}
</script>
4. 渲染函数的变化
4.1 渲染函数Api变化
只要是h
函数签名的变化,Vue 3 中的 h
函数参数顺序更加清晰。
Vue2示例
h(tag, [data], [children])
Vue3示例
import { h } from 'vue';h('div', { class: 'container' }, [h('span', 'Hello, world!')
]);
4.2 删除 $scopedSlots
属性,并通过 $slots
将所有槽作为函数公开
在 Vue 2 中,作用域插槽(Scoped Slots)是通过 $scopedSlots
访问的。而在 Vue 3 中,所有的插槽都通过 $slots
访问,并且默认都是函数形式。
Vue2示例
<template><child-component v-slot:default="slotProps">{{ slotProps.text }}</child-component>
</template><script>
export default {methods: {render() {return this.$scopedSlots.default({text: 'Hello from scoped slot'});}}
};
</script>
Vue3示例
在 Vue 3 中,你可以直接通过 $slots
访问所有插槽,并且它们默认都是函数形式。插槽默认是函数形式,不再需要区分 $scopedSlots
和普通插槽。
import { h } from 'vue';export default {setup(props, { slots }) {return () => h('div', slots.default ? slots.default({ text: 'Hello from scoped slot' }) : '');}
};
4.3 $listeners
被删除/合并到$attrs
在 Vue 2 中,$listeners
是一个包含所有非原生事件监听器的对象。而在 Vue 3 中,$listeners
被移除,其功能被合并到了 $attrs
中。
Vue示例
<template><child-component @custom-event="handleCustomEvent" />
</template><script>
export default {methods: {handleCustomEvent() {console.log('Custom event triggered');}},mounted() {console.log(this.$listeners); // 包含所有自定义事件监听器}
};
</script>
Vue3示例
在 Vue 3 中,自定义事件监听器现在也包含在 $attrs
中。
<template><child-component v-bind="$attrs" />
</template><script setup>
import { useAttrs } from 'vue';const attrs = useAttrs();console.log(attrs); // 包含所有自定义事件监听器和其他属性
</script>
4.4 $attrs
包括class
和style
属性
在 Vue 3 中,$attrs
不仅包含自定义属性,还包括 class
和 style
属性。这使得 $attrs
更加全面,可以处理更多的属性传递。
Vue2示例
<template><child-component class="custom-class" style="color: red;" />
</template><script>
export default {mounted() {console.log(this.$attrs); // 不包括 class 和 style}
};
</script>
Vue3示例
<template><child-component v-bind="$attrs" />
</template><script setup>
import { useAttrs } from 'vue';const attrs = useAttrs();console.log(attrs); // 包括 class 和 style
</script>
5. 总结
更多详细内容参考👇 👇 👇
Breaking Changes | Vue 3 Migration Guide
更多相关内容👇 👇 👇
Vue3入门到实战_借来一夜星光的博客-CSDN博客
相关文章:

【Vue3 入门到实战】16. Vue3 非兼容性改变
目录 1. 全局 API 的变化 2. 模板指令的变化 2.1 组件v-model用法 2.2 template v-for用法 2.3 v-if 和v-for 优先级变化 2.4 v-bind"object" 顺序敏感 2.5 v-on:event.native 被移除 3. 组件的变化 3.1 功能组件只能使用普通函数创建 3.2 SFC弃用功能属性…...
20250214 随笔 Elasticsearch(ES)索引数据 vs. 业务数据库冗余双写
Elasticsearch(ES)索引数据 vs. 业务数据库冗余双写的区别、优缺点分析 在高并发数据查询场景下,Elasticsearch(ES) 和 业务数据库冗余双写 都是常见的数据同步方案。它们主要区别在于数据存储方式、查询性能、数据一…...
c# textbox 设置不获取光标
[DllImport("user32",EntryPoint "HideCaret")] private static extern bool HideCaret(IntPtr hWnd); //需引入命名空间using System.Runtime.InteropServices; private void Txt_RecInfo_MouseDown(object sender, MouseEventArgs e) { …...

中望CAD c#二次开发 ——VS环境配置
新建类库项目:下一步 下一步 下一步: 或直接: 改为: <Project Sdk"Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>NET48</TargetFramework> <LangVersion>pr…...

anolis os 8.9安装jenkins
一、系统版本 # cat /etc/anolis-release Anolis OS release 8.9 二、安装 # dnf install -y epel-release # wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo # rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.…...

HtmlRAG:RAG系统中,HTML比纯文本效果更好
HtmlRAG 方法通过使用 HTML 而不是纯文本来增强 RAG 系统中的知识表示能力。通过 HTML 清洗和两步块树修剪方法,在保持关键信息的同时缩短了 HTML 文档的长度。这种方法优于现有基于纯文本的RAG的性能。 方法 其实主要看下围绕html提纯思路,将提纯后的…...

TypeScript 中的 reduce计算统计之和
1、计算字符串数组中最大的一项,比如数组:list ["家长会,柘城,喝士大夫","模压,手动阀,阿斯蒂"],求出list中字符串长度之和最大的那项: // 初始化变量来存储字数之和最多的项及其字数之和let maxWord ;let…...
HTTP/2 由来及特性
HTTP/2 的由来 HTTP/1.x 的局限性 性能瓶颈 队头阻塞问题:在HTTP/1.x中,一个TCP连接在同一时间只能处理一个请求,后续请求必须等待前面的请求处理完成并收到响应后才能被处理。例如,当一个页面有多个资源(如图片、脚…...
android 安装第三方apk自动赋予运行时权限
摘要:行业机使用场景点击运行时权限很麻烦,而随着android的演进,对于权限的管控越发严格。故本文通过对系统的修改实现第三方app在运行时直接获取全部权限。 通过属性ro.perms.force_grant控制功能开关。 Index: frameworks/base/services/…...
PyTorch Lightning LightningDataModule 介绍
LightningDataModule 是 PyTorch Lightning 提供的数据模块,用于统一管理数据加载流程(包括数据准备、预处理、拆分、批量加载等)。它的核心作用是将数据处理逻辑与模型解耦,提高代码的可复用性和可读性。 1. LightningDataModule 的作用 ✅ 封装数据预处理:数据下载、清…...

windows平台上 oracle简单操作手册
一 环境描述 Oracle 11g单机环境 二 基本操作 2.1 数据库的启动与停止 启动: C:\Users\Administrator>sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on 星期五 7月 31 12:19:51 2020 Copyright (c) 1982, 2013, Oracle. All rights reserved. 连接到:…...

【网络安全 | 漏洞挖掘】价值3133美元的Google IDOR
未经许可,不得转载。 文章目录 正文正文 目标URL:REDACTED.google.com。 为了深入了解其功能,我查阅了 developer.google.com 上的相关文档,并开始进行测试。 在测试过程中,我发现了一个 XSS 漏洞,但它触发的域名是经过正确沙盒化的 *.googleusercontent.com,这符合 …...

LabVIEW太阳能制冷监控系统
在全球能源需求日益增长的背景下,太阳能作为一种无限再生能源,被广泛应用于各种能源系统中。本基于LabVIEW软件和STM32F105控制器的太阳能制冷监控系统的设计与实现,提供一个高效、经济的太阳能利用方案,以应对能源消耗的挑战。 项…...

10.2 Git 内部原理 - Git 对象
Git 对象 Git 是一个内容寻址文件系统,听起来很酷。但这是什么意思呢? 这意味着,Git 的核心部分是一个简单的键值对数据库(key-value data store)。 你可以向 Git 仓库中插入任意类型的内容,它会返回一个唯…...
作业。。。。。
顺序表按元素删除 参数:删除元素,顺序表 1.调用元素查找的函数 4.根据下表删除 delete_sub(list,sub); //删除元素 void delete_element(int element, Sqlist *list) …...

android 的抓包工具
charles 抓包工具 官网地址 nullCharles Web Debugging Proxy - Official Sitehttps://www.charlesproxy.com/使用手册一定记得看官网 SSL Certificates • Charles Web Debugging Proxy http请求: 1.启动代理: 2.设置设备端口 3.手机连接当前代理 …...

深入剖析推理模型:从DeepSeek R1看LLM推理能力构建与优化
著名 AI 研究者和博主 Sebastian Raschka 又更新博客了。原文地址:https://sebastianraschka.com/blog/2025/understanding-reasoning-llms.html。这一次,他将立足于 DeepSeek 技术报告,介绍用于构建推理模型的四种主要方法,也就是…...
linux中top命令详解
linux中top命令详解 top 是 Linux 中用于实时监控系统资源使用情况的命令,显示包括 CPU、内存、进程等信息的动态视图。以下是 top 命令的详细说明: 命令格式 top [选项] 常用选项 -d:设置刷新间隔时间(秒)。 -n&am…...

前端包管理器的发展以及Npm、Yarn和Pnpm对比
在现代前端开发中,包管理器是不可或缺的核心工具。随着 JavaScript 生态的快速发展,开发者经历了从 npm 一统天下到 Yarn 挑战格局,再到 pnpm 创新突破的技术演进。这里将对三种主流包管理器(npm/Yarn/pnpm)进行全方位…...

node.js+兰空图床实现随机图
之前博客一直用的公共的随机图API,虽然图片的质量都挺不错的,但是稳定性都比较一般,遂打算使用之前部署的兰空图床,自己弄一个随机图 本文章服务器操作基于雨云——新一代云服务提供商的云服务器进行操作,有兴趣的话可…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...