Vue3 完整学习笔记 - 第二部分

ops/2025/2/5 11:38:45/

Vue3 完整学习笔记 - 第二部分

2. Vue3 响应式系统深入

2.1 ref 深入理解

重点掌握:

  • ref 的工作原理
  • 基本类型和对象类型的处理差异
  • template 中的自动解包

核心示例:

<template><div><!-- 模板中自动解包,无需 .value --><h1>{{ message }}</h1><p>Count: {{ count }}</p><button @click="increment">+1</button></div>
</template><script setup>
import { ref } from 'vue'// 基本类型的响应式
const count = ref(0)
const message = ref('Hello')// 在 JS 中需要 .value
const increment = () => {count.value++message.value = `Count is ${count.value}`
}// 对象类型的响应式
const user = ref({name: 'John',age: 30
})// 修改对象属性仍需要 .value
function updateUser() {user.value.age++// 或者整个替换对象user.value = { name: 'Jane', age: 25 }
}
</script>

2.2 reactive 深入理解

重点掌握:

  • reactive 的使用场景
  • 响应式对象的限制
  • 解构和展开的处理

示例代码:

<template><div><h2>{{ state.user.name }}</h2><p>Age: {{ state.user.age }}</p><button @click="updateState">Update State</button></div>
</template><script setup>
import { reactive, toRefs } from 'vue'// 创建响应式对象
const state = reactive({user: {name: 'John',age: 30},settings: {theme: 'dark',notification: true}
})// ❌ 解构会失去响应性
const { user } = state// ✅ 使用 toRefs 保持响应性
const { settings } = toRefs(state)const updateState = () => {// 直接修改嵌套属性state.user.age++state.settings.theme = 'light'
}
</script>

2.3 toRefs 和 toRef 的使用

重点掌握:

  • toRefs 的使用场景
  • toRef 单个属性的处理
  • 解构响应式对象的正确方式

示例代码:

<template><div><h2>{{ name }}</h2><p>Age: {{ age }}</p><button @click="increment">Age +1</button></div>
</template><script setup>
import { reactive, toRefs, toRef } from 'vue'const state = reactive({name: 'John',age: 30
})// 转换整个对象
const { name, age } = toRefs(state)// 或者单独转换一个属性
const ageRef = toRef(state, 'age')const increment = () => {// 都是响应式的age.value++// 或者ageRef.value++
}// 使用场景:组件属性解构
const props = defineProps(['title'])
const title = toRef(props, 'title')
</script>

2.4 computed 计算属性

重点掌握:

  • 计算属性的基本使用
  • getter 和 setter
  • 计算属性缓存特性

示例代码:

<template><div><input v-model="firstName" /><input v-model="lastName" /><p>Full name: {{ fullName }}</p><!-- 使用可写计算属性 --><input v-model="fullName" /></div>
</template><script setup>
import { ref, computed } from 'vue'const firstName = ref('John')
const lastName = ref('Doe')// 只读计算属性
const fullName = computed(() => {return `${firstName.value} ${lastName.value}`
})// 可写计算属性
const fullName = computed({get() {return `${firstName.value} ${lastName.value}`},set(newValue) {[firstName.value, lastName.value] = newValue.split(' ')}
})// 带缓存的计算属性
const expensiveComputed = computed(() => {console.log('computing...')return someExpensiveOperation(firstName.value)
})
</script>

2.5 watch 侦听器基础

重点掌握:

  • 基本数据类型的侦听
  • 对象的侦听
  • 多个数据源的侦听

示例代码:

<script setup>
import { ref, watch } from 'vue'const count = ref(0)
const message = ref('Hello')
const user = ref({ name: 'John', age: 30 })// 侦听单个ref
watch(count, (newValue, oldValue) => {console.log(`Count changed from ${oldValue} to ${newValue}`)
})// 侦听多个数据源
watch([count, message], ([newCount, newMessage], [oldCount, oldMessage]) => {console.log('Values changed:', { newCount, newMessage, oldCount, oldMessage })
})// 侦听对象
watch(user, (newUser, oldUser) => {console.log('User changed:', newUser, oldUser)
}, { deep: true }) // 深度侦听// 立即执行
watch(count, (newValue) => {console.log(`Initial count: ${newValue}`)
}, { immediate: true })
</script>

2.6 watchEffect 的使用

重点掌握:

  • watchEffect 的自动依赖追踪
  • 停止侦听
  • 清理副作用

示例代码:

<script setup>
import { ref, watchEffect } from 'vue'const count = ref(0)
const message = ref('Hello')// 自动收集依赖
const stop = watchEffect(() => {console.log(`Count is ${count.value}`)console.log(`Message is ${message.value}`)
})// 带清理的副作用
watchEffect((onCleanup) => {const timer = setInterval(() => {count.value++}, 1000)// 清理函数onCleanup(() => clearInterval(timer))
})// 停止侦听
setTimeout(() => {stop()
}, 5000)// 异步请求示例
watchEffect(async () => {const response = await fetch(`/api/user/${count.value}`)const data = await response.json()message.value = data.name
})
</script>

http://www.ppmy.cn/ops/155849.html

相关文章

基于springboot+vue的中药实验管理系统(源码+数据库+文档)

中药实验管理系统 目录 基于springbootvue的中药实验管理系统 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师&#xff0c;…

51c视觉~CV~合集10

我自己的原文哦~ https://blog.51cto.com/whaosoft/13241694 一、CV创建自定义图像滤镜 热图滤镜 这组滤镜提供了各种不同的艺术和风格化光学图像捕捉方法。例如&#xff0c;热滤镜会将图像转换为“热图”&#xff0c;而卡通滤镜则提供生动的图像&#xff0c;这些图像看起来…

Spring Boot基本项目结构

要写一个Spring Boot 项目对于新手小白来说&#xff0c;首先要了解Spring Boot 的基本架构&#xff0c;学会如何创建一个简单的spring boot项目。 springboot 基于maven做的&#xff08;前提保证maven是装好并且IDEA配置好的&#xff09;&#xff08;面向接口编程&#xff09;…

深度解析近期爆火的 DeepSeek

最近&#xff0c;AI 领域有个名字频繁出现在大众视野 ——DeepSeek&#xff0c;它的火爆程度就像一颗投入平静湖面的巨石&#xff0c;激起千层浪。今天&#xff0c;咱们就来深入了解一下这个 “AI 新星”。 官网&#xff1a;DeepSeek - 探索未至之境 DeepSeek 是什么 DeepSeek…

试用ChatGPT开发一个大语言模型聊天App

参考官方文档&#xff0c;安装android studio https://developer.android.com/studio/install?hlzh-cn 参考这个添加permission权限&#xff1a; https://blog.csdn.net/qingye_love/article/details/14452863 参考下面链接完成Android Studio 给项目添加 gradle 依赖 ht…

git push到远程仓库时无法推送大文件

一、错误 remote: Error: Deny by project hooks setting ‘default’: size of the file ‘scientific_calculator’, is 164 MiB, which has exceeded the limited size (100 MiB) in commit ‘4c91b7e3a04b8034892414d649860bf12416b614’. 二、原因 本地提交过大文件&am…

Unity游戏(Assault空对地打击)开发(6) 鼠标光标的隐藏

前言 鼠标光标在游戏界面太碍眼了&#xff0c;要隐藏掉。 详细操作 新建一个脚本HideCursor&#xff0c;用于隐藏光标。 写入以下代码。 意义&#xff1a;游戏开始自动隐藏光标&#xff0c;按Esc&#xff08;显示<-->隐藏&#xff09;。 using System.Collections; using…

SQL范式与反范式_优化数据库性能

1. 引言 什么是SQL范式 SQL范式是指数据库设计中的一系列规则和标准,旨在减少数据冗余、提高数据完整性和一致性。常见的范式包括第一范式(1NF)、第二范式(2NF)、第三范式(3NF)和BCNF(Boyce-Codd范式)。 什么是SQL反范式 SQL反范式是指在满足范式要求的基础上,有…