Vue3知识点梳理

注:纯手打,如有错误欢迎评论区交流!
转载请注明出处:https://blog.csdn.net/testleaf/article/details/148056625
编写此文是为了更好地学习前端知识,如果损害了有关人的利益,请联系删除!
本文章将不定时更新,敬请期待!!!
欢迎点赞、收藏、转发、关注,多谢!!!

目录

    • 一、Vue2选项式API和Vue3组合式API
    • 二、Vue3相比于Vue2的优势
    • 三、使用create-vue搭建Vue3项目
    • 四、组合式API - setup选项
    • 五、组合式API - reactive和ref函数
    • 六、组合式API - computed
    • 七、组合式API - watch
    • 八、组合式API - 生命周期函数

一、Vue2选项式API和Vue3组合式API

1、Vue 2 选项式 API(Options API)​

<template><div><p>{{ message }}</p><button @click="reverseMessage">Reverse</button></div>
</template><script>
export default {data() {return { message: "Hello Vue 2!" };},methods: {reverseMessage() {this.message = this.message.split('').reverse().join('');}},mounted() {console.log("Component mounted!");}
};
</script>

2、Vue 3 组合式 API(Composition API)

<template><div><p>{{ message }}</p><button @click="reverseMessage">Reverse</button></div>
</template><script>
import { ref, onMounted } from 'vue';export default {setup() {const message = ref("Hello Vue 3!");const reverseMessage = () => {message.value = message.value.split('').reverse().join('');};onMounted(() => {console.log("Component mounted!");});return { message, reverseMessage };}
};
</script>

3、核心对比

​​对比维度​​​​Vue 2 选项式 API​​​​Vue 3 组合式 API​​
​​​​代码组织方式​​​​按选项(datamethods 等)分类​​按逻辑功能聚合(setup() 函数内)
​​​​逻辑复用​​​​依赖 mixins(易冲突)​​自定义组合函数(无冲突)
​​​​TypeScript 支持​​​​ 较弱(this 类型推断困难)​​优秀(ref、reactive 类型明确)
​​​​适用场景​​​​ 简单组件、小型项目​​复杂组件、大型项目、逻辑复用需求
​​​​响应式系统​​​​基于 Object.defineProperty(Vue 2)​​ 基于 Proxy(Vue 3,性能更好)

二、Vue3相比于Vue2的优势

1、更容易维护:组合式API、更好的TypeScript支持;
2、更快的速度:重写diff算法、模板编译优化、更高效的组件初始化;
3、更优的数据响应式:Proxy
4、更小的体积:良好的TreeShaking、按需引入;

三、使用create-vue搭建Vue3项目

1、认识create-vue
create-vue是Vue官方新的脚手架工具,底层切换到了 vite (下一代前端工具链),为开发提供极速响应。
vue-cli的底层是webpack
2、使用create-vue创建项目

npm init vue@latest

3、项目关键文件

  • vite.config.js - 项目的配置文件:基于vite的配置
  • package.json - 项目包文件:核心依赖项变成了 Vue3.xvite
  • main.js - 入口文件:createApp函数创建应用实例
  • app.vue - 根组件:SFC单文件组件 script - template - style
    • 变化一:脚本script和模板template顺序调整
    • 变化二:模板template不再要求唯一根元素
    • 变化三:脚本script添加setup标识支持组合式API
  • index.html - 单页入口:提供idapp的挂载点

四、组合式API - setup选项

1、写法

<script>export default {setup(){},beforeCreate(){}}
</script>

2、执行时机
beforeCreate钩子之前执行;
3、setup中写代码的特点
setup函数中写的数据和方法需要在末尾以对象的方式return,才能给模版使用;
4、<script setup>语法糖
script标签添加 setup标记,不需要再写导出语句,默认会添加导出语句;

<script setup>const message = 'this is message'const logMessage = ()=>{console.log(message)}
</script>

五、组合式API - reactive和ref函数

1、reactive
接受对象类型数据的参数传入并返回一个响应式的对象;

import { reactive } from 'vue'const state = reactive({count: 0,message: 'Hello Vue!'
})// 访问和修改
state.count++
console.log(state.message)

2、ref
接收简单类型或者对象类型的数据传入并返回一个响应式的对象;

import { ref } from 'vue'const count = ref(0)
const message = ref('Hello Vue!')// 访问和修改
count.value++ // 注意需要通过.value访问
console.log(message.value)

3、比较与选择

特性reactiveref
适用类型对象任意值
访问方式直接访问.value
模板中使用直接使用自动解包
解构响应性丢失保持

4、使用建议

  • 当需要管理一组相关状态时,使用reactive
  • 当需要管理单个原始值时,使用ref
  • 在组合式函数中返回状态时,通常使用ref以保持灵活性

六、组合式API - computed

计算属性基本思想和Vue2保持一致,组合式API下的计算属性只是修改了API写法;
基本用法:

import { ref, computed } from 'vue'const count = ref(0)// 创建一个计算属性
const doubleCount = computed(() => count.value * 2)console.log(doubleCount.value) // 0
count.value++
console.log(doubleCount.value) // 2

可写计算属性:

const firstName = ref('John')
const lastName = ref('Doe')const fullName = computed({get() {return `${firstName.value} ${lastName.value}`},set(newValue) {[firstName.value, lastName.value] = newValue.split(' ')}
})fullName.value = 'Jane Smith' // 会自动更新firstName和lastName

七、组合式API - watch

1、基本用法

import { ref, watch } from 'vue'const count = ref(0)// 基本watch用法
watch(count, (newValue, oldValue) => {console.log(`count从${oldValue}变为${newValue}`)
})

2、观察多个源

const firstName = ref('')
const lastName = ref('')// 观察多个ref
watch([firstName, lastName], ([newFirst, newLast], [oldFirst, oldLast]) => {console.log(`名字从${oldFirst} ${oldLast}变为${newFirst} ${newLast}`)
})

3、观察响应式对象

const state = reactive({user: {name: 'Alice',age: 25}
})// 深度观察对象
watch(() => state.user,(newUser, oldUser) => {console.log('用户信息变化:', newUser)},{ deep: true }
)

4、立即执行

const data = ref(null)// 立即执行回调
watch(data,(newValue) => {console.log('数据:', newValue)},{ immediate: true }
)

5、观察getter函数

const state = reactive({items: [],total: 0
})// 观察计算值
watch(() => state.items.length,(newLength) => {console.log(`项目数量变为: ${newLength}`)}
)

6、停止观察

const stop = watch(count, (newValue) => {if (newValue > 10) {stop() // 停止观察console.log('已达到最大值,停止观察')}
})

7、实际应用示例

<template><div><input v-model="searchQuery" placeholder="搜索..."><div v-if="isSearching">搜索中...</div><ul v-else><li v-for="result in searchResults" :key="result.id">{{ result.name }}</li></ul></div>
</template><script setup>
import { ref, watch } from 'vue'const searchQuery = ref('')
const searchResults = ref([])
const isSearching = ref(false)// 防抖搜索
watch(searchQuery, async (newQuery) => {if (!newQuery.trim()) {searchResults.value = []return}isSearching.value = truetry {// 模拟API调用await new Promise(resolve => setTimeout(resolve, 300))searchResults.value = await mockSearch(newQuery)} finally {isSearching.value = false}
})async function mockSearch(query) {// 模拟API返回return [{ id: 1, name: `${query} 结果1` },{ id: 2, name: `${query} 结果2` }]
}
</script>

8、watchEffect
与watch相关的还有watchEffect,它会立即执行一次,并自动追踪其依赖:

import { ref, watchEffect } from 'vue'const count = ref(0)watchEffect(() => {console.log(`count的值是: ${count.value}`)
})

9、比较watch和watchEffect

特性watchwatchEffect
惰性执行否(立即执行)
指定观察源需要自动追踪
访问旧值可以不可以
初始化执行需要配置immediate总是执行

10、最佳实践

  • ​​避免过度使用​​:优先使用计算属性,只在需要副作用时使用watch
  • ​​清理副作用​​:在回调中执行异步操作时,注意清理之前的操作;
  • ​​性能优化​​:对于复杂对象,考虑使用{ deep: true }或特定getter函数;
  • ​​组件卸载时​​:在setup()中创建的watch会自动停止,手动创建的记得清理;

八、组合式API - 生命周期函数

在Vue 3的组合式API中,生命周期钩子是通过特定的函数来访问的,而不是Options API中的选项形式。
1、主要生命周期函数
onBeforeMount 和 onMounted:

import { onBeforeMount, onMounted } from 'vue'onBeforeMount(() => {console.log('组件即将挂载')
})onMounted(() => {console.log('组件已挂载')// 可以访问DOM元素
})

onBeforeUpdate 和 onUpdated:

import { onBeforeUpdate, onUpdated } from 'vue'onBeforeUpdate(() => {console.log('组件即将更新')
})onUpdated(() => {console.log('组件已更新')// DOM已更新完成
})

onBeforeUnmount 和 onUnmounted:

import { onBeforeUnmount, onUnmounted } from 'vue'onBeforeUnmount(() => {console.log('组件即将卸载')
})onUnmounted(() => {console.log('组件已卸载')// 清理定时器、事件监听等
})

onErrorCaptured:

import { onErrorCaptured } from 'vue'onErrorCaptured((err, instance, info) => {console.error('捕获到错误:', err)// 返回false阻止错误继续向上传播return false
})

2、新增的生命周期函数
Vue 3还引入了两个新的生命周期函数:
onRenderTracked (开发模式):

import { onRenderTracked } from 'vue'onRenderTracked((event) => {console.log('跟踪到依赖:', event)
})

onRenderTriggered (开发模式):

import { onRenderTriggered } from 'vue'onRenderTriggered((event) => {console.log('触发重新渲染:', event)
})

3、组合式API与Options API生命周期对应关系

组合式APIOptions API
onBeforeMountbeforeMount
onMountedmounted
onBeforeUpdatebeforeUpdate
onUpdatedupdated
onBeforeUnmountbeforeUnmount
onUnmountedunmounted
onErrorCapturederrorCaptured
onActivatedactivated
onDeactivateddeactivated

4、实际应用示例

<template><div><h2>生命周期示例</h2><p>计数: {{ count }}</p><button @click="count++">增加</button></div>
</template><script setup>
import { ref, onBeforeMount, onMounted,onBeforeUpdate,onUpdated,onBeforeUnmount,onUnmounted
} from 'vue'const count = ref(0)onBeforeMount(() => {console.log('1. 组件即将挂载 - count:', count.value)
})onMounted(() => {console.log('2. 组件已挂载 - 可以访问DOM')// 这里可以执行需要DOM的操作
})onBeforeUpdate(() => {console.log('3. 组件即将更新 - 旧count:', count.value)
})onUpdated(() => {console.log('4. 组件已更新 - 新count:', count.value)
})onBeforeUnmount(() => {console.log('5. 组件即将卸载')
})onUnmounted(() => {console.log('6. 组件已卸载')// 清理工作
})
</script>

5、最佳实践

  • ​​逻辑组织​​:将相关生命周期逻辑放在一起,保持代码可读性;
  • ​​清理工作​​:在onUnmounted中清理定时器、事件监听等资源;
  • ​​避免滥用​​:不是所有逻辑都需要放在生命周期中,有些可以放在方法中按需调用;
  • ​​异步操作​​:在onMounted中进行DOM操作或数据获取;
  • 性能优化​​:使用onRenderTracked和onRenderTriggered调试性能问题;

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

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

相关文章

C++23 新增的查找算法详解:ranges::find_last 系列函数

文章目录 引言C Ranges 库简介ranges::find_last、ranges::find_last_if 和 ranges::find_last_if_not 概述ranges::find_last示例代码代码解释 ranges::find_last_if函数签名参数解释示例代码代码解释 ranges::find_last_if_not示例代码代码解释 使用场景总结 引言 在 C 的发…

DW_DMAC简介

基本概念&#xff1a; DMA&#xff1a;全称direct memory access&#xff0c;即直接存储器访问。dma可以在中央处理器CPU不参与的情况下&#xff0c;实现外设和内存之间的数据直接传输&#xff0c;从而提高数据传输效率 外设与计算机内存之间的数据传输&#xff0c;一般可通过…

信号量基础入门:并发控制的核心概念

问题的复杂性产生的根本原因在于&#xff0c;如 2.2 节所述&#xff0c;共享变量的访问始终是“单向信息流”。也就是说&#xff0c;一个进程可以分配新值或检查当前值&#xff0c;但这种检查不会为其他进程留下任何痕迹。结果是&#xff0c;当一个进程想要对共享变量的当前值作…

(十九)Java集合框架深度解析:从基础到高级应用

一、集合框架概述 1.1 什么是集合框架 Java集合框架(Java Collections Framework, JCF)是Java语言中用于表示和操作集合的一套标准化体系结构。它提供了一组接口、实现类和算法&#xff0c;用于存储和操作对象组&#xff0c;解决了数组在存储对象时的诸多限制。 集合框架的主…

Blender cycles烘焙贴图笔记

下载了一些枪模型&#xff0c;一个模型有七八个材质&#xff0c;一个扳机、准星还有单独的材质&#xff0c;用的贴图只有一小部分有内容&#xff0c;对Draw Call非常不友好。不得不学一下怎么用Blender减材质。 找到了这个视频如何在Blender中将多种材料多张贴图烘焙成一张贴图…

mysql的高可用

1. 环境准备 2台MySQL服务器&#xff08;node1: 192.168.1.101&#xff0c;node2: 192.168.1.102&#xff09;2台HAProxy Keepalived服务器&#xff08;haproxy1: 192.168.1.103&#xff0c;haproxy2: 192.168.1.104&#xff09;虚拟IP&#xff08;VIP: 192.168.1.100&#x…

鸿蒙 系统-安全-程序访问控制-应用权限管控

Ability Kit 提供了一种允许应用访问系统资源&#xff08;如&#xff1a;通讯录等&#xff09;和系统能力&#xff08;如&#xff1a;访问摄像头、麦克风等&#xff09;的通用权限访问方式&#xff0c;来保护系统数据&#xff08;包括用户个人数据&#xff09;或功能&#xff0…

算法-数对的使用

1、数对可用于数组排序中&#xff0c;并且可记忆化排序前的元素下标 #include<iostream> #include<string> #include<bits/stdc.h> using namespace std; typedef long long ll; const int N 2e5 10; pair<int, int> a[N]; void solve() {ll n;cin …

Linux基础第四天

系统之间文件共享 想要实现两个不同的系统之间实现文件共享&#xff0c;最简单的一种方案就是设置VMware软件的共享文件夹&#xff0c;利用共享文件夹可以实现linux系统和windows系统之间的文件共享&#xff0c;这样就可以实现在windows系统上编辑程序&#xff0c;然后在linux系…

Docker 核心原理详解:Namespaces 与 Cgroups 如何实现资源隔离与限制

#Docker疑难杂症解决指南# Docker 作为容器化技术的代名词,彻底改变了软件的开发、部署和管理方式。它凭借其轻量、快速、一致性强的特性,成为了现代云原生架构的基石。然而,Docker 容器的神奇之处并非“无中生有”,其背后是 Linux 内核的两大核心技术——Namespaces(命名…

GitHub 趋势日报 (2025年05月14日)

本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日整体趋势 Top 10 排名项目名称项目描述今日获星总星数语言1xming521/WeClone&#x1f680;从聊天记录创造数字分身的一站式解决方案&…

【Go】从0开始学习Go

文章目录 从0开始学习Go0 与C对比1 代码框架1.1 helloworld式代码示例1.2 主体代码元素&#xff08;核心三部分&#xff09;1.3 其他 2 与C/C区别3 有用的小工具4 注意事项 从0开始学习Go 0 与C对比 特性CGo编译型语言需要编译为机器码直接编译为二进制可执行文件静态类型类型…

简单说一下 Webpack分包

最近在看有关webpack分包的知识&#xff0c;搜索了很多资料&#xff0c;感觉这一块很是迷惑&#xff0c;网上的资料讲的也迷迷糊糊&#xff0c;这里简单总结分享一下&#xff0c;也当个笔记。 如有错误请指出。 为什么需要分包 我们知道&#xff0c;webpack的作用&#xff0c…

使用Python和FastAPI构建网站爬虫:Oncolo医疗文章抓取实战

使用Python和FastAPI构建网站爬虫&#xff1a;Oncolo医疗文章抓取实战 前言项目概述技术栈代码分析1. 导入必要的库2. 初始化FastAPI应用3. 定义请求模型4. 核心爬虫功能4.1 URL验证和准备4.2 设置HTTP请求4.3 发送请求和解析HTML4.4 提取文章内容4.5 保存结果和返回数据 5. AP…

YoloV8改进策略:卷积篇|风车卷积|即插即用

文章目录 论文信息论文翻译摘要引言相关研究红外搜索与跟踪检测和分割网络红外搜索与跟踪数据集的损失函数红外搜索与跟踪数据集方法风车形卷积(PConv)基于尺度的动态损失SIRST - UAVB数据集实验实验设置与其他方法的比较多模型上的消融实验结论致谢代码改进方法测试结果总结…

【NLP】36. 从指令微调到人类偏好:构建更有用的大语言模型

从指令微调到人类偏好&#xff1a;构建更有用的大语言模型 大语言模型&#xff08;LLMs&#xff09;已经成为现代自然语言处理系统的核心&#xff0c;但单纯依赖传统语言建模目标&#xff0c;往往难以满足实际应用的“人类意图”。从 Instruction Tuning&#xff08;指令微调&…

基于Transformers与深度学习的微博评论情感分析及AI自动回复系统

前言 这个项目存在cookie没有自动更新问题&#xff0c;后续可能会发出来解决教程&#xff0c;还有微博网页版的话最多看到300条评论&#xff0c;而且回复别人信息的话最多回复15条就要休息5分钟左右才能评论 1. 项目概述 本项目实现了一个微博评论自动化处理系统&#xff0c…

详解 Zephyr RTOS:架构、功能与开发指南

目录 Zephyr RTOS 的核心特性 1. 轻量级和可扩展性 2. 实时性能 3. 多平台支持 4. 安全性 5. 社区和生态系统 Zephyr 的架构 1. 内核 2. 驱动模型 3. 网络栈 4. 文件系统 开发环境和工具链 安装和配置 开发流程 1. 应用程序开发 2. 调试和测试 3. 部署 实际应…

人工智能重塑医疗健康:从辅助诊断到个性化治疗的全方位变革

人工智能正在以前所未有的速度改变着医疗健康领域&#xff0c;从影像诊断到药物研发&#xff0c;从医院管理到远程医疗&#xff0c;AI 技术已渗透到医疗服务的各个环节。本文将深入探讨人工智能如何赋能医疗健康产业&#xff0c;分析其在医学影像、临床决策、药物研发、个性化医…

Linux笔记---内核态与用户态

用户态&#xff08;User Mode&#xff09; 权限级别&#xff1a;较低&#xff0c;限制应用程序直接访问硬件或关键系统资源。 适用场景&#xff1a;普通应用程序的运行环境。 限制&#xff1a;无法执行特权指令&#xff08;如操作I/O端口、修改内存管理单元配置等&#xff09…