从 Vue 2 到 Vue 3:全面升级指南
🌈个人主页:前端青山
🔥系列专栏:Vue篇
🔖人终将被年少不可得之物困其一生
依旧青山,本期给大家带来Vuet篇专栏内容:Vue-从 Vue 2 到 Vue 3:全面升级指南
前言
随着前端技术的不断发展,Vue.js 作为一种轻量级且高效的框架,受到了广大开发者的喜爱。本文将详细介绍 Vue 2 和 Vue 3 的核心概念和实用技巧,并通过具体的代码示例来展示如何在项目中使用这些功能。我们还将探讨 Vue 2 和 Vue 3 之间的主要区别,帮助读者更好地理解和应用这些技术。
目录
前言
知识点
1. Vue 2 基础
1.1 组件化开发
代码示例
1.2 数据绑定
代码示例
1.3 计算属性和监听属性
计算属性
代码示例
监听属性
代码示例
2. Vue 3 新特性
2.1 Composition API
代码示例
2.2 Teleport
代码示例
2.3 计算属性和监听属性
计算属性
代码示例
监听属性
代码示例
3. 状态管理
3.1 Vuex
代码示例
3.2 Pinia
代码示例
Vue 2 和 Vue 3 的主要区别
1. 语法和 API 变化
1.1 模板语法
代码示例
1.2 Composition API
代码示例
2. 性能优化
2.1 渲染机制
2.2 编译器优化
3. 新特性
3.1 Teleport
代码示例
3.2 Fragments
代码示例
3.3 Suspense
代码示例
计算属性和监听属性的区别
1. 计算属性(Computed Properties)
代码示例
2. 监听属性(Watchers)
代码示例
总结
知识点
1. Vue 2 基础
1.1 组件化开发
Vue 2 强调组件化开发,通过将页面拆分为多个独立的组件,提高代码的可维护性和复用性。
代码示例
<!-- MyComponent.vue -->
<template><div class="my-component"><h1>{{ title }}</h1><p>{{ content }}</p></div>
</template>
<script>
export default {name: 'MyComponent',props: {title: String,content: String}
}
</script>
<style scoped>
.my-component {border: 1px solid #ccc;padding: 10px;margin: 10px;
}
</style>
1.2 数据绑定
Vue 2 提供了多种数据绑定方式,包括插值表达式、指令等。
代码示例
<!-- App.vue -->
<template><div id="app"><h1>{{ message }}</h1><input v-model="message" /></div>
</template>
<script>
export default {data() {return {message: 'Hello Vue 2!'}}
}
</script>
1.3 计算属性和监听属性
计算属性(Computed Properties)和监听属性(Watchers)是 Vue 2 中非常重要的概念,用于处理复杂的数据逻辑。
计算属性
计算属性用于声明式地描述依赖关系,当依赖的数据发生变化时,计算属性会自动更新。
代码示例
<!-- App.vue -->
<template><div id="app"><p>First Name: <input v-model="firstName" /></p><p>Last Name: <input v-model="lastName" /></p><p>Full Name: {{ fullName }}</p></div>
</template>
<script>
export default {data() {return {firstName: '',lastName: ''}},computed: {fullName() {return `${this.firstName} ${this.lastName}`}}
}
</script>
监听属性
监听属性用于观察数据的变化,并执行相应的操作。
代码示例
<!-- App.vue -->
<template><div id="app"><p>Counter: {{ counter }}</p><button @click="increment">Increment</button></div>
</template>
<script>
export default {data() {return {counter: 0}},methods: {increment() {this.counter++}},watch: {counter(newVal, oldVal) {console.log(`Counter changed from ${oldVal} to ${newVal}`)}}
}
</script>
2. Vue 3 新特性
2.1 Composition API
Vue 3 引入了 Composition API,使得逻辑更加清晰和模块化。
代码示例
<!-- MyComponent.vue -->
<template><div class="my-component"><h1>{{ title }}</h1><p>{{ content }}</p></div>
</template>
<script setup>
import { ref, defineProps } from 'vue'
const props = defineProps({title: String,content: String
})
</script>
<style scoped>
.my-component {border: 1px solid #ccc;padding: 10px;margin: 10px;
}
</style>
2.2 Teleport
Teleport 组件允许将模态框或其他组件的内容渲染到 DOM 的其他位置,从而避免样式冲突。
代码示例
<!-- Modal.vue -->
<template><teleport to="body"><div class="modal" v-if="visible"><div class="modal-content"><span @click="closeModal" class="close">×</span><p>{{ message }}</p></div></div></teleport>
</template>
<script setup>
import { ref } from 'vue'
const visible = ref(true)
const closeModal = () => {visible.value = false
}
</script>
<style scoped>
.modal {position: fixed;top: 0;left: 0;width: 100%;height: 100%;background-color: rgba(0, 0, 0, 0.5);display: flex;justify-content: center;align-items: center;
}
.modal-content {background-color: white;padding: 20px;border-radius: 5px;position: relative;
}
.close {position: absolute;top: 10px;right: 10px;cursor: pointer;
}
</style>
2.3 计算属性和监听属性
Vue 3 中的计算属性和监听属性与 Vue 2 类似,但 Composition API 提供了更灵活的方式来使用它们。
计算属性
代码示例
<!-- App.vue -->
<template><div id="app"><p>First Name: <input v-model="firstName" /></p><p>Last Name: <input v-model="lastName" /></p><p>Full Name: {{ fullName }}</p></div>
</template>
<script setup>
import { ref, computed } from 'vue'
const firstName = ref('')
const lastName = ref('')
const fullName = computed(() => {return `${firstName.value} ${lastName.value}`
})
</script>
监听属性
代码示例
App.vue
<template><div id="app"><p>Counter: {{ counter }}</p><button @click="increment">Increment</button></div>
</template>
<script setup>
import { ref, watch } from 'vue'
const counter = ref(0)
const increment = () => {counter.value++
}
watch(counter, (newVal, oldVal) => {console.log(`Counter changed from ${oldVal} to ${newVal}`)
})
</script>
3. 状态管理
3.1 Vuex
Vuex 是 Vue 的状态管理库,适用于大型应用的状态管理。
代码示例
javascript// store.js
import Vue from 'vue'
import Vuex from 'vuex'Vue.use(Vuex)export default new Vuex.Store({state: {count: 0},mutations: {increment(state) {state.count++}},actions: {increment({ commit }) {commit('increment')}},getters: {doubleCount(state) {return state.count * 2}}
})
vue<!-- App.vue -->
<template><div id="app"><p>Count: {{ count }}</p><p>Double Count: {{ doubleCount }}</p><button @click="increment">Increment</button></div>
</template><script>
import { mapState, mapGetters, mapActions } from 'vuex'export default {computed: {...mapState(['count']),...mapGetters(['doubleCount'])},methods: {...mapActions(['increment'])}
}
</script>
3.2 Pinia
Pinia 是 Vue 3 的新状态管理库,提供了更简洁的 API 和更好的 TypeScript 支持。
代码示例
javascript// store.js
import { defineStore } from 'pinia'
export const useCounterStore = defineStore('counter', {state: () => ({count: 0}),actions: {increment() {this.count++}},getters: {doubleCount: (state) => state.count * 2}
})
<!-- App.vue -->
<template><div id="app"><p>Count: {{ count }}</p><p>Double Count: {{ doubleCount }}</p><button @click="increment">Increment</button></div>
</template>
<script setup>
import { useCounterStore } from './store'
import { storeToRefs } from 'pinia'
const counterStore = useCounterStore()
const { count, doubleCount } = storeToRefs(counterStore)
const { increment } = counterStore
</script>
Vue 2 和 Vue 3 的主要区别
1. 语法和 API 变化
1.1 模板语法
-
Vue 2: 使用
v-on
和v-bind
指令。 -
Vue 3: 依然支持
v-on
和v-bind
,但引入了更简洁的语法,如@
和:
。
代码示例
Vue 2
<template><button v-on:click="handleClick">Click me</button><input v-bind:value="value" />
</template>
Vue 3
<template><button @click="handleClick">Click me</button><input :value="value" />
</template>
1.2 Composition API
-
Vue 2: 主要使用 Options API。
-
Vue 3: 引入了 Composition API,使得逻辑更加模块化和可复用。
代码示例
Vue 2
<template><div><p>{{ message }}</p></div>
</template><script>
export default {data() {return {message: 'Hello Vue 2!'}},methods: {updateMessage() {this.message = 'Updated message'}}
}
</script>
Vue 3
<template><div><p>{{ message }}</p></div>
</template><script setup>
import { ref } from 'vue'const message = ref('Hello Vue 3!')const updateMessage = () => {message.value = 'Updated message'
}
</script>
2. 性能优化
2.1 渲染机制
-
Vue 2: 使用虚拟 DOM 进行渲染。
-
Vue 3: 优化了虚拟 DOM 的实现,减少了内存占用和提升了渲染性能。
2.2 编译器优化
-
Vue 2: 编译器对模板进行静态分析,生成渲染函数。
-
Vue 3: 编译器进行了更多的优化,如静态树提升、动态节点标记等,进一步提高了运行时性能。
3. 新特性
3.1 Teleport
-
Vue 2: 没有 Teleport 组件。
-
Vue 3: 引入了 Teleport 组件,允许将模态框或其他组件的内容渲染到 DOM 的其他位置。
代码示例
Vue 3
<template><teleport to="body"><div class="modal" v-if="visible"><div class="modal-content"><span @click="closeModal" class="close">×</span><p>{{ message }}</p></div></div></teleport>
</template><script setup>
import { ref } from 'vue'const visible = ref(true)const closeModal = () => {visible.value = false
}
</script>
3.2 Fragments
-
Vue 2: 不支持多个根节点。
-
Vue 3: 支持 Fragments,允许组件有多个根节点。
代码示例
Vue 3
<template><div>First element</div><div>Second element</div>
</template>
3.3 Suspense
-
Vue 2: 没有 Suspense 组件。
-
Vue 3: 引入了 Suspense 组件,用于异步组件的加载和错误处理。
代码示例
Vue 3
<template><suspense><template #default><AsyncComponent /></template><template #fallback><div>Loading...</div></template></suspense>
</template><script setup>
import { defineAsyncComponent } from 'vue'const AsyncComponent = defineAsyncComponent(() => import('./AsyncComponent.vue'))
</script>
计算属性和监听属性的区别
1. 计算属性(Computed Properties)
-
定义: 计算属性是基于其依赖的数据自动生成的属性。
-
特点
:
-
声明式地描述依赖关系。
-
当依赖的数据发生变化时,计算属性会自动更新。
-
计算属性是惰性的,只有在被访问时才会重新计算。
-
代码示例
Vue 2
<template><div><p>First Name: <input v-model="firstName" /></p><p>Last Name: <input v-model="lastName" /></p><p>Full Name: {{ fullName }}</p></div>
</template><script>
export default {data() {return {firstName: '',lastName: ''}},computed: {fullName() {return `${this.firstName} ${this.lastName}`}}
}
</script>
Vue 3
<template><div><p>First Name: <input v-model="firstName" /></p><p>Last Name: <input v-model="lastName" /></p><p>Full Name: {{ fullName }}</p></div>
</template><script setup>
import { ref, computed } from 'vue'const firstName = ref('')
const lastName = ref('')const fullName = computed(() => {return `${firstName.value} ${lastName.value}`
})
</script>
2. 监听属性(Watchers)
-
定义: 监听属性用于观察数据的变化,并执行相应的操作。
-
特点
:
-
声明式地观察数据的变化。
-
当被监听的数据发生变化时,会触发回调函数。
-
监听属性是主动的,每次数据变化都会触发回调。
-
代码示例
Vue 2
<template><div><p>Counter: {{ counter }}</p><button @click="increment">Increment</button></div>
</template>
<script>
export default {data() {return {counter: 0}},methods: {increment() {this.counter++}},watch: {counter(newVal, oldVal) {console.log(`Counter changed from ${oldVal} to ${newVal}`)}}
}
</script>
Vue 3
<template><div><p>Counter: {{ counter }}</p><button @click="increment">Increment</button></div>
</template>
<script setup>
import { ref, watch } from 'vue'
const counter = ref(0)
const increment = () => {counter.value++
}
watch(counter, (newVal, oldVal) => {console.log(`Counter changed from ${oldVal} to ${newVal}`)
})
</script>
总结
Vue 2 和 Vue 3 都是非常强大的前端框架,各有优势。Vue 3 在性能、API 设计和新特性方面进行了大量的改进,使得开发体验更加流畅和高效。希望本文能够帮助你更好地理解和应用这些技术。
相关文章:
从 Vue 2 到 Vue 3:全面升级指南
🌈个人主页:前端青山 🔥系列专栏:Vue篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Vuet篇专栏内容:Vue-从 Vue 2 到 Vue 3:全面升级指南 前言 随着前端技术的不断发展,Vue.j…...
Apache paimon表操作实战-5
维表Join Paimon支持Lookup Join语法,它用于从 Paimon 查询的数据来补充维度字段。要求一个表具有处理时间属性,而另一个表由查找源连接器支持。 Paimon 支持 Flink 中具有主键的表和append-only的表查找联接。以下示例说明了此功能。 USE CATALOG fs_catalog; CREATE TABL…...
阿里云用STS上传oss的完整程序执行流程图 和前端需要哪些参数uniapp
H5 微信小程序可用的前端直传阿里云OSS(STS临时凭证前端签名)直接下载插件 下面是原理说明: 明白了,我来详细说明前端上传文件到阿里云OSS需要携带的具体参数: 从服务器获取的 STS 凭证: // 这些参数需要从你的后端服务器获…...
决策树方法根据指定条件筛选方案
代码功能说明 条件类:Condition 类用于定义每个条件的范围,并提供一个方法 is_satisfied 来检查输入值是否满足该条件。 算法选择器类:AlgorithmSelector 类负责应用条件并记录不满足的条件。它提供方法 apply_condition 用于更新可用算法&a…...
多特征变量序列预测(四) Transformer-BiLSTM风速预测模型
往期精彩内容: 时序预测:LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较 全是干货 | 数据集、学习资料、建模资源分享! EMD、EEMD、FEEMD、CEEMD、CEEMDAN的区别、原理和Python实现(一)EMD-CSDN博客 EMD、EEM…...
【开源免费】基于SpringBoot+Vue.JS蜗牛兼职平台 (JAVA毕业设计)
本文项目编号 T 034 ,文末自助获取源码 \color{red}{T034,文末自助获取源码} T034,文末自助获取源码 目录 一、系统介绍1.1 平台架构1.2 管理后台1.3 用户网页端1.4 技术特点 二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景…...
Ajax笔记
介绍 Ajax是一种网页开发技术,全称是Asynchronous JavaScript and XML(异步JavaScript和XML)。作用如下: 数据交换:可以通过Ajax给服务器发送请求,并获取服务器响应的数据。即前端动态的发送Ajax到服务器端…...
软考:缓存分片和一致性哈希
缓存分片技术是一种将数据分散存储在多个节点上的方法,它在分布式缓存系统中尤为重要。这项技术的核心目的是提高系统的性能和可扩展性,同时确保数据的高可用性。以下是缓存分片技术的一些关键点: 数据分片:缓存分片涉及将数据分成…...
3109 体验积分值
经验值:1200 时间限制:1000毫秒 内存限制:128MB 合肥市第34届信息学竞赛(2017年) 不许抄袭,一旦发现,直接清空经验! 题目描述 Description 卡卡西和小朋友们做完了烧脑的数字游…...
初识jsp
学习本章节前建议先安装Tomcat web服务器:tomcat下载安装及配置教程_tomcat安装-CSDN博客 1、概念 我的第一个JSP程序: 在WEB-INF目录之外创建一个index.jsp文件,然后这个文件中没有任何内容。将上面的项目部署之后,启动服务器…...
Ansible 的脚本 --- playbooks剧本
playbooks 本身由以下各部分组成 (1)Tasks:任务,即通过 task 调用 ansible 的模板将多个操作组织在一个 playbook 中运行 (2)Vars:变量 (3)Templates:模板 &a…...
Windows 死机时 系统错误日志分析与故障排除
目录 前言正文 前言 对于服务器异常重启,推荐阅读:详细分析服务器自动重启原因(涉及Linux、Window) 以下主要做一个总结梳理 正文 查看系统事件日志: 可以查看系统事件日志,找出可能导致系统崩溃的错误…...
基于pytorch搭建CNN
先上代码 import torch import torch.nn as nn import torch.optim as optim import torch.nn.functional as F from torchvision import datasets, transforms import matplotlib.pyplot as plt import numpy as np import pandas as pd import matplotlibmatplotlib.use(tkA…...
C#实现与Windows服务的交互与控制
在C#中,与Windows服务进行交互和控制通常涉及以下几个步骤: 创建Windows服务:首先,需要创建一个Windows服务项目。可以使用Visual Studio中的“Windows 服务 (.NET Framework)”项目模板来创建Windows服务。 配置服务控制事件&am…...
Java和Ts构造函数的区别
java中子类在使用有参构造创建对象的时候不必要必须调用父类有参构造 而js则必须用super()调用父类的有参构造,即使用不到也必须传递 Java 中的处理方式 可选择性参数: 在 Java 中,当子类使用父类的有参构造方法创建对象时,可以只传递需要的参数。如果父…...
植物健康,Spring Boot来助力
3系统分析 3.1可行性分析 通过对本植物健康系统实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本植物健康系统采用SSM框架,JAVA作为开发语言&#…...
百度文心一言接入流程-java版
百度文心一言接入流程-java版 一、准备工作二、API接口调用-java三、百度Prompt工程参考资料: 百度文心一言:https://yiyan.baidu.com/百度千帆大模型:https://qianfan.cloud.baidu.com/百度千帆大模型文档:https://cloud.baidu.com/doc/WENXINWORKSHOP/index.html千tokens…...
Java 11 新特性深度解析与应用实践
Java 作为一种广泛应用的编程语言,不断演进以满足开发者日益增长的需求和适应技术的发展趋势。Java 11 带来了一系列重要的新特性和改进,这些变化不仅提升了语言的性能和功能,还为开发者提供了更好的开发体验和工具。本文将深入探讨 Java 11 …...
druid 连接池监控报错 Sorry, you are not permitted to view this page.本地可以,发布正式出错
简介: druid 连接池监控报错 Sorry, you are not permitted to view this page. 使用Druid连接池的时候,遇到一个奇怪的问题,在本地(localhost)可以直接打开Druid连接池监控,在其他机器上打开会报错&#…...
[RN与H5] 加载线上H5通信失败问题记录(启动本地H5服务OK)
RT: nextjs项目 在本地启动H5服务, 本地开发都OK 发布到线上后, 效果全无, 经排查发现, 写了基本配置的js脚本在挂载时机上的差异导致 根本原因是...
electron 打包
安装及配置 安装electron包以及electron-builder打包工具 # 安装 electron cnpm install --save-dev electron # 安装打包工具 cnpm install electron-builder -D 参考的package.json文件 其中description和author为必填项目 {"name": "appfile",&qu…...
ChatGLM-6B和Prompt搭建专业领域知识问答机器人应用方案(含完整代码)
目录 ChatGLM-6B部署 领域知识数据准备 领域知识数据读取 知识相关性匹配 Prompt提示工程 领域知识问答 完整代码 本文基于ChatGLM-6B大模型和Pompt提示工程搭建医疗领域知识问答机器人为例。 ChatGLM-6B部署 首先需要部署好ChatGLM-6B,参考 ChatGLM-6B中英双…...
虚拟机配置静态IP地址(人狠话不多简单粗暴)
1.先找到以下位置: 2. 虚拟机中执行vi /etc/sysconfig/network-scripts/ifcfg-ens33 根据上图信息修改配置文件内容: 静态IP地址设置不超过255就行,我这里弄得100,没毛病。 3.修改并保存文件后,重启网络执行&#…...
Android token JJWT
在Android开发领域,JJWT(Java JWT,即Java Json Web Token)库是一个流行的工具,用于处理JSON Web Tokens(JWTs)。JWT是一种轻量级的、自包含的、基于JSON的用于双方之间安全传输信息的简洁的、UR…...
动态规划<一>初识动态规划
目录 认识动态规划 LeetCodeOJ练习 斐波那契数列模型 认识动态规划 1.动态规划是一种用于解决优化问题的算法策略。 2.它的核心原理是把一个复杂的问题分解为一系列相互关联的子问题。通过先求解子问题,并且记录这些子问题的解(通常用一个表格之类的…...
【AIGC】ChatGPT提示词Prompt精确控制指南:Scott Guthrie的建议详解与普通用户实践解析
博客主页: [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 💯前言💯斯科特古斯里(Scott Guthrie)的建议解读人机交互设计的重要性减轻用户认知负担提高Prompt的易用性结论 💯普通用户视角的分析普通用户…...
2024年10月24日随笔
1024程序员节啊,现在已经是晚上的十点半了,我还在实验室里没走,刚把力扣的每日一题写完,好忙啊,好忙啊,好忙啊,为什么都大三了我还不能做自己的事情,今天老师开会说要给互联网加大赛…...
怎么做系统性能优化
对于软件或系统的性能优化,可以采取多种措施来提高效率和响应速度。这里为您列举一些常见的方法: 1. 代码优化:检查并优化算法复杂度,减少不必要的计算。使用更高效的数据结构和算法。 2. 数据库优化: •索引优化&…...
负载均衡:四层与七层
负载均衡建立在现在网络基础之上,提供一种廉价透明有效的方式扩展网络设备和服务器带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。负载均衡可分为七层负载与四层负载。 四层负载(目标地址与端口交换) 主要通过报文中…...
【Ubuntu】服务器系统重装SSHxrdpcuda
本文作者: slience_me Ubuntu系统重装操作合集 文章目录 Ubuntu系统重装操作合集1.1 系统安装:1.2 安装openssh-server更新系统包安装OpenSSH服务器检查SSH服务的状态配置防火墙以允许SSH测试SSH连接配置SSH(可选) 1.3 安装远程连…...
兵团第二师建设环保局网站/长沙正规竞价优化推荐
更好的学习网址:http://www.voidspace.org.uk/python/articles/urllib2.shtml#openers-and-handlers以下为个人学习笔记。在开始后面的内容之前,先来解释一下urllib2中的两个个方法:info and geturl urlopen返回的应答对象response(或者HTTPE…...
wordpress交流插件/易观数据app排行
MySql配置优化MySql对内存的使用MySql内存配置位物理内存的70%左右 大部分情况下使用innodb作为表存储引擎 以下参数配置在my.cnf中 1. innodb的缓冲池配置 innodb_buffer_pool_size一般配置服务器总内存的60~70% 2. innodb log 日志缓存配置innodb_log_buffer_size 这个不宜…...
网站关键词排名优化方法/百度关键词首页排名服务
蒙特卡洛方法(Monte Carlo method,也有翻译成“蒙特卡罗方法”)是以概率和统计的理论、方法为基础的一种数值计算方法,将所求解的问题同一定的概率模型相联系,用计算机实现统计模拟或抽样,以获得问题的近似…...
浙江杭州/百度seo服务方案
一、定义 又称anchor伪类,是专门为控制链接属性的 二、详解 a:link(没有接触过的链接),用于定义了链接的常规状态。a:hover(鼠标放在链接上的状态),用于产生视觉效果。a:visited(访问过的链接),…...
衢州建设局网站/贵州快速整站优化
首先应该大体了解什么是HTML 5,HTML 5 就是第五代W3C的核心语言也就是我们常说的HTML代码。它是在HTML4.01上做了一次新的改革,或是说是为了弥补上一个版本的不足之处。从而加强不同User-agent之间的互操作性。HTML 5 将会带入一种更好的功能来帮助程序员…...
卖机票的网站怎么做/pc网站优化排名
实现的效果如下 我们要完成的效果有以下特点: 1.背景图是一个半透明的背景 2.在被选中时文字颜色变为红色,文字下面也有一个红色的指示器 3.在刚进入这个页面时,默认选中第一个 虽然可以使用xib进行设计,但是太繁琐,不…...