当前位置: 首页 > news >正文

vue3基础知识

书接上文,这篇继续来学习vue3的核心语法,可以先看上一篇再来看这篇效果更好。

1. computed

computed 用于创建 计算属性,即基于其他响应式数据的值动态计算并缓存的属性。它的主要作用是优化性能和提高代码的可维护性,避免不必要的重复计算。

a. 基本语法

computed 是通过 computed() 函数创建的。在 setup() 函数中,你可以使用 computed 来定义计算属性。

import { computed, ref } from 'vue';export default {setup() {const count = ref(0);const doubledCount = computed(() => count.value * 2);return { count, doubledCount };}
};

解释:

  • count 是一个响应式数据,初始值为 0
  • doubledCount 是一个计算属性,它依赖于 count,并返回 count 的两倍。
  • count 的值发生变化时,doubledCount 会自动重新计算。

b. 计算属性的缓存

computed 的一个重要特性是 缓存。只有当计算属性依赖的响应式数据发生变化时,computed 才会重新计算,否则会直接返回上一次计算的结果。

import { computed, ref } from 'vue';export default {setup() {const count = ref(0);// 计算属性:返回 count 的平方const squaredCount = computed(() => {console.log('Computing squared count');return count.value * count.value;});return { count, squaredCount };}
};

在上面的例子中,如果你多次访问 squaredCount,你会看到 “Computing squared count” 只会在 count 改变时打印一次,而不会在每次访问时都打印,这就是 computed 的缓存机制。

c. 使用 computed 的场景

  • 计算派生状态:当你需要基于现有的响应式数据计算新的值时,computed 很有用。例如,计算一个总价、折扣后价格、过滤后的列表等。

    const price = ref(100);
    const discount = ref(0.2);const discountedPrice = computed(() => price.value * (1 - discount.value));
    
  • 优化性能:通过缓存计算结果,computed 可以避免重复计算,提升性能。

  • 条件渲染:你可以使用 computed 来做一些复杂的条件判断,而不需要在模板中使用大量的 v-if

watch 的对比

watch 用于观察响应式数据的变化,并执行副作用操作,如更新外部状态或执行异步操作。它适合处理需要副作用的场景,而 computed 更适合处理计算派生状态并返回值。

import { watch, ref } from 'vue';const count = ref(0);// 使用 watch
watch(count, (newValue) => {console.log('Count changed:', newValue);
});// 使用 computed
const doubledCount = computed(() => count.value * 2);
  • watch 用于监听 count 的变化,并在变化时执行某个副作用。
  • computed 用于计算并返回派生值,在模板中或其他地方直接使用。

2. watch

在 Vue 3 中,watch 是用于 监听响应式数据的变化 并在数据变化时执行副作用操作的 API。它特别适用于处理那些需要在数据变化时执行的逻辑,例如异步请求、数据处理、或者与外部系统交互。

watch 的基本概念

  • 监听watch 允许你监控一个或多个响应式数据的变化。
  • 副作用:当被监听的数据发生变化时,watch 会执行一个回调函数,你可以在回调中执行任何副作用操作(例如,发起异步请求、更新外部状态等)。
  • 深度监听watch 也可以深度监听对象或数组的变化,适合用于嵌套对象或数组的更新。

a. 基本语法

watch 接受三个参数:

  • 第一个参数:要观察的响应式数据或计算属性。
  • 第二个参数:回调函数,监听到数据变化时会调用它。
  • 第三个参数(可选):配置对象,可以设置一些附加选项,如 immediatedeep

最简单的使用方式

import { ref, watch } from 'vue';export default {setup() {const count = ref(0);// 监听 count 的变化watch(count, (newValue, oldValue) => {console.log(`count changed from ${oldValue} to ${newValue}`);});return { count };}
};

解释

  • watch 监听 count 的变化,每当 count 发生变化时,会调用回调函数。
  • 回调函数接收两个参数:newValue(新的值)和 oldValue(旧的值),可以在回调中执行任何副作用操作。

b. watch 的高级用法

监听多个响应式数据

你可以同时监听多个响应式数据,当它们中的任意一个变化时,回调都会被触发。

import { ref, watch } from 'vue';export default {setup() {const count = ref(0);const name = ref('Alice');// 同时监听 count 和 name 的变化watch([count, name], ([newCount, newName], [oldCount, oldName]) => {console.log(`count changed from ${oldCount} to ${newCount}`);console.log(`name changed from ${oldName} to ${newName}`);});return { count, name };}
};

深度监听对象或数组

默认情况下,watch 只会监听对象或数组的 引用变化,而不会递归监听其内部属性或元素。要实现深度监听,可以使用 deep: true 配置选项。

import { ref, watch } from 'vue';export default {setup() {const user = ref({name: 'Alice',age: 25});// 深度监听 user 对象的变化watch(user, (newValue, oldValue) => {console.log('User changed:', newValue);}, { deep: true });return { user };}
};

立即执行(immediate

watch 默认在被监听的数据发生变化时才会执行回调。如果你希望在监听开始时立即执行回调,可以使用 immediate: true 配置。

import { ref, watch } from 'vue';export default {setup() {const count = ref(0);// 监听 count 的变化,并立即执行回调watch(count, (newValue, oldValue) => {console.log(`count changed from ${oldValue} to ${newValue}`);}, { immediate: true });return { count };}
};

执行异步操作

watch 是非常适合用于执行异步操作的。比如,当某个数据变化时,你可能需要去发起一个 API 请求。

import { ref, watch } from 'vue';export default {setup() {const searchQuery = ref('');// 监听 searchQuery 的变化,发起一个异步操作watch(searchQuery, async (newQuery) => {if (newQuery) {const results = await fetch(`https://api.example.com/search?q=${newQuery}`);console.log(await results.json());}});return { searchQuery };}
};

2.1 watchEffect 的使用

watchEffectwatch 的一个变体,它会在组件挂载时立即执行,并且会自动追踪作用域内所有的响应式依赖。与 watch 主要是用于监听特定数据的变化不同,watchEffect 会自动检测你使用的所有响应式数据。

import { ref, watchEffect } from 'vue';export default {setup() {const count = ref(0);// watchEffect 会自动监听 count 的变化watchEffect(() => {console.log(`Count has changed: ${count.value}`);});return { count };}
};

watchEffectwatch 的区别:

  • watch:用于精确监听一个或多个特定的数据源,并可以对变化做出响应。
  • watchEffect:自动追踪你在其作用域内使用的所有响应式数据,并在数据变化时重新执行回调。

c. watch 的使用场景

  • 监听数据变化并执行副作用:例如,发起 API 请求、更新外部状态等。
  • 异步操作:比如在数据变化时发起一个网络请求或进行复杂的数据处理。
  • 表单验证:在表单字段变化时执行验证逻辑。
  • 数据持久化:监听数据变化并将数据持久化到本地存储或服务器。

3. props

props 是父组件向子组件传递数据的一种方式。通过 props,父组件可以将数据或参数传递给子组件,从而实现组件之间的通信。

a. 基本概念

  • 父组件 -> 子组件props 是单向数据流(单向绑定)的机制,数据只能从父组件传递到子组件,子组件不能直接修改从父组件接收的 props
  • 类型验证:Vue 允许对传递的 props 进行类型验证和默认值设置,从而确保数据的正确性。

b. 基本使用

父组件

<script lang="ts" setup name="App">import Person from './components/Person.vue'import {reactive} from 'vue'import {type Persons} from './types'let persons = reactive<Persons>([{id:'e98219e12', name:'张三', age:18},{id:'e98219e13', name:'李四', age:19},{id:'e98219e14', name:'王五', age:20}])
</script>

子组件

<script lang="ts" setup name="Person">import {defineProps} from 'vue'// types中包含了Persons类型import {type Persons} from '@/types'// 第一种写法:仅接收// const props = defineProps(['list'])// 第二种写法:接收 + 限制类型// defineProps<{list:Persons}>()// 第三种写法:接收 + 限制类型 + 指定默认值 + 限制必要性// list后如果加?表示可传可不传,不加则必须传let props = withDefaults(defineProps<{list?:Persons}>(),{list:()=>[{id:'asdasg01',name:'小猪佩奇',age:18}]})console.log(props)
</script>

通过 props,Vue 提供了一种简单而高效的组件通信方式,非常适合用于父子组件之间的数据传递和状态共享。


4. Hooks

  • 什么是hook?—— 本质是一个函数,把setup函数中使用的Composition API进行了封装,类似于vue2.x中的mixin。
  • 自定义hook的优势:复用代码, 让setup中的逻辑更清楚易懂。

示例代码:
useSum.ts

import {ref,onMounted} from 'vue'export default function(){let sum = ref(0)const increment = ()=>{sum.value += 1}const decrement = ()=>{sum.value -= 1}onMounted(()=>{increment()})//向外部暴露数据return {sum,increment,decrement}
}		

useDog.ts

import {reactive,onMounted} from 'vue'
import axios,{AxiosError} from 'axios'export default function(){let dogList = reactive<string[]>([])// 方法async function getDog(){try {// 发请求let {data} = await axios.get('https://dog.ceo/api/breed/pembroke/images/random')// 维护数据dogList.push(data.message)} catch (error) {// 处理错误const err = <AxiosError>errorconsole.log(err.message)}}// 挂载钩子onMounted(()=>{getDog()})//向外部暴露数据return {dogList,getDog}
}

App.vue

<template><h2>当前求和为:{{sum}}</h2><button @click="increment">点我+1</button><button @click="decrement">点我-1</button><hr><img v-for="(u,index) in dogList.urlList" :key="index" :src="(u as string)"> <span v-show="dogList.isLoading">加载中......</span><br><button @click="getDog">再来一只狗</button>
</template><script lang="ts">import {defineComponent} from 'vue'export default defineComponent({name:'App',})
</script><script setup lang="ts">import useSum from './hooks/useSum'import useDog from './hooks/useDog'let {sum,increment,decrement} = useSum()let {dogList,getDog} = useDog()
</script>

是的,hook 可以帮助实现模块化开发,尤其在 Vue 3 中,结合 组合式 API (Composition API) 使用时,它极大地提高了代码的可复用性和模块化程度。

分析:

  • 模块化:通过将数据获取和表单处理的逻辑分别提取到 useSumuseDog hook 中,逻辑更加清晰和模块化。
  • 复用性:这两个 hook 可以在不同的组件中复用,而无需重复编写相同的代码。
  • 解耦:不同的功能模块(如数据请求、表单验证等)被清晰地分离开来,组件只负责调用这些 hook,减少了组件内部的复杂度。

如果你能看到这里给你点个赞,如果对你有帮助的话不妨点赞支持一下~
参考:张天禹老师b站课程

相关文章:

vue3基础知识

书接上文&#xff0c;这篇继续来学习vue3的核心语法&#xff0c;可以先看上一篇再来看这篇效果更好。 1. computed computed 用于创建 计算属性&#xff0c;即基于其他响应式数据的值动态计算并缓存的属性。它的主要作用是优化性能和提高代码的可维护性&#xff0c;避免不必要…...

【Linux系统】Ubuntu 缓冲区机制

在Ubuntu中&#xff0c;和其他操作系统有个不一样的机制&#xff1a;缓冲区。这篇文章是对与缓冲区的详细介绍。 在 Ubuntu 中&#xff08;以及其他基于 Linux 的操作系统&#xff09;&#xff0c;缓冲区&#xff08;Buffer&#xff09;是内核用于优化 I/O 操作的重要机制。它…...

ChatGPT 最新推出的 Pro 订阅计划,具备哪些能力 ?

OpenAI 最近推出了 ChatGPT Pro&#xff0c;这是一个每月收费 200 美元的高级订阅计划&#xff0c;旨在为用户提供对 OpenAI 最先进模型和功能的高级访问。 以下是 ChatGPT Pro 的主要功能和能力&#xff1a; 高级模型访问&#xff1a; o1 模型&#xff1a;包括 o1 和 o1 Pro…...

数据结构理论

内容来源青岛大学数据结构与算法课程&#xff0c;链接&#xff1a;数据结构与算法基础&#xff08;青岛大学-王卓&#xff09;_哔哩哔哩_bilibili 绪论 数据结构概述 数据结构和算法的定义&#xff1a;我们如何把现实中大量而复杂的问题以特定的数据类型和特定的存储结构保存…...

es 3期 第14节-全文文本分词查询

#### 1.Elasticsearch是数据库&#xff0c;不是普通的Java应用程序&#xff0c;传统数据库需要的硬件资源同样需要&#xff0c;提升性能最有效的就是升级硬件。 #### 2.Elasticsearch是文档型数据库&#xff0c;不是关系型数据库&#xff0c;不具备严格的ACID事务特性&#xff…...

六安市第二届网络安全大赛复现

misc 听说你也喜欢俄罗斯方块&#xff1f; ppt拼接之后 缺三个角补上 flag{qfnh_wergh_wqef} 流量分析 流量包分离出来一个压缩包 出来一张图片 黑色代表0白色代表1 101010 1000 rab 反的压缩包 转一下 密码&#xff1a;拾叁拾陆叁拾贰陆拾肆 密文&#xff1a;4p4n5758…...

Sarcomere仿人灵巧手ARTUS,20个自由度拓宽机器人作业边界

Sarcomere Dynamics 是一家深度技术先驱&#xff0c;通过开发和商业化仿人机械来改变机器人行业。专注于为科研人员&#xff0c;系统集成商和制造商提供更实惠、更轻便且更灵活的末端执行器替代品。凭借创新的致动器技术&#xff0c;创造了一款紧凑、轻便且非常坚固的机械手Art…...

Django drf 基于serializers 快速使用

1. 安装: pip install djangorestframework 2. 添加rest_framework到您的INSTALLED_APPS设置。 settings.pyINSTALLED_APPS [...rest_framework, ] 3. 定义模型 models.pyfrom django.db import modelsclass BookModel(models.Model):name models.CharField(max_length64)…...

pycharm集成环境中关于安装sklearn库报错问题分析及解决

在输入pip install sklearn后&#xff0c;出现如下提示&#xff1a; pip install sklearn Collecting sklearn Using cached sklearn-0.0.post12.tar.gz (2.6 kB) Installing build dependencies ... done Getting requirements to build wheel ... error error: subprocess-…...

AI - 浅聊一下基于LangChain的AI Agent

AI - 浅聊一下基于LangChain的AI Agent 大家好&#xff0c;今天我们来聊聊一个很有意思的主题&#xff1a; AI Agent &#xff0c;就是目前非常流行的所谓的AI智能体。AI的发展日新月异&#xff0c;都2024年末了&#xff0c;如果此时小伙伴们对这个非常火的概念还不清楚的话&a…...

《【Linux】深入理解进程管理与 fork 系统调用的实现原理》

一、引言 在 Linux 操作系统中&#xff0c;进程管理是核心功能之一。进程是操作系统进行资源分配和调度的基本单位。理解进程管理的原理以及 fork 系统调用的实现对于深入掌握 Linux 系统的运行机制至关重要。本文将深入探讨 Linux 中的进程管理以及 fork 系统调用的实现原理&a…...

docker-compose部署skywalking 8.1.0

一、下载镜像 #注意 skywalking-oap-server和skywalking java agent版本强关联&#xff0c;版本需要保持一致性 docker pull elasticsearch:7.9.0 docker pull apache/skywalking-oap-server:8.1.0-es7 docker pull apache/skywalking-ui:8.1.0二、部署文件docker-compose.yam…...

AI 总结的的 AI 学习路线

一、入门阶段&#xff1a;数学基础与编程语言 数学基础 线性代数 当年白纸黑字推演&#xff0c; 都是泪啊&#xff0c;草稿本都用了一卷。 学习向量、矩阵的基本概念&#xff0c;包括向量的加法、减法、点积和叉积&#xff0c;矩阵的乘法、转置等运算。例如&#xff0c;在计算…...

离散傅里叶级数(DFS)详解

1. 引言 离散傅里叶级数&#xff08;Discrete Fourier Series, DFS&#xff09;是信号处理领域中一项基础且重要的数学工具&#xff0c;用于分析和处理周期性的离散信号。它通过将离散时间信号表示为一组正弦和余弦的和&#xff0c;从而使得信号在频域上得到更清晰的描述。与连…...

Java 类加载机制详解

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…...

1.1 Beginner Level学习之“编写简单的发布服务器和订阅服务器”(第十一节)

学习大纲&#xff1a; 1. 编写发布服务器节点 在 ROS 中&#xff0c;节点是连接到 ROS 网络的可执行文件。我创建了一个名为 talker 的发布者节点&#xff0c;它会向一个主题 chatter 不断发送消息。 首先&#xff0c;进入你的工作包 beginner_tutorials&#xff08;假设你已…...

AIQuora:开启论文写作新篇章

在这个信息爆炸的时代&#xff0c;学术写作已成为研究者不可或缺的技能。然而&#xff0c;面对繁重的写作任务&#xff0c;许多学者和学生常常感到力不从心。AIQuora&#xff0c;一个专业的文理工科论文智能写作助手&#xff0c;以其免费开题报告生成功能&#xff0c;为学术写作…...

【C语言】库函数常见的陷阱与缺陷(1):字符串处理函数

目录 一、 strcpy 函数 1.1. 功能与常见用法 1.2. 陷阱与缺陷 1.3. 安全替代 1.4. 代码示例 二、strcat 函数 2.1. 功能与常见用法 2.2. 陷阱与缺陷 2.3. 安全替代 2.4. 代码示例 三、strcmp 函数 3.1. 功能与常见用法 3.2. 陷阱与缺陷 3.3. 安全替代 3.4. 代…...

Mysql索引原理及优化——岁月云实战笔记

根据Mysql索引原理及优化这个博主的视频学习&#xff0c;对现在的岁月云项目中mysql进行优化&#xff0c;我要向这个博主致敬&#xff0c;之前应用居多&#xff0c;理论所知甚少&#xff0c;于是将学习到东西&#xff0c;应用下来&#xff0c;看看是否有好的改观。 1 索引原理…...

AGCRN论文解读

一、创新点 传统GCN只能基于静态预定义图建模全局共享模式&#xff0c;而AGCRN通过两种GCN的增强模块&#xff08;NAPL、DAGG&#xff09;实现了更精细的节点特性学习和图结构生成。 1 节点自适应参数学习模块&#xff08;NAPL&#xff09; 传统GCN通过共享参数&#xff08;权重…...

视觉显著目标的自适应分割与动态网格生成算法研究

ArticleObjectiveMethodComments视觉显著目标的自适应分割背景是基于视觉注意模型和最大熵分割算法&#xff0c;针对复杂背景下的显著目标分割问题。目的是提出一种自适应显著目标分割方法&#xff0c;以便快速准确地从场景图像中检测出显著目标。试验用的方法是通过颜色、强度…...

多机驱动振动系统同步控制理论【附模型】

✨ 长期致力于振动机械、自同步、控制同步、GA-BP PID、定速比研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09;GA-BP神经网络PID控制器设计及其参数自…...

嵌入式开发内存优化实战:裁剪IRLib2红外库,释放微控制器Flash空间

1. 项目概述&#xff1a;当红外遥控遇上内存焦虑红外遥控&#xff0c;这个听起来有点“复古”的技术&#xff0c;至今仍是智能家居、玩具和各类嵌入式设备里最经济可靠的无线通信方案之一。它的原理不复杂&#xff1a;用一个特定频率&#xff08;通常是38kHz&#xff09;的载波…...

ESP-SR深度解析:嵌入式语音识别系统的架构设计与性能优化实战指南

ESP-SR深度解析&#xff1a;嵌入式语音识别系统的架构设计与性能优化实战指南 【免费下载链接】esp-sr Speech recognition 项目地址: https://gitcode.com/gh_mirrors/es/esp-sr 在物联网设备智能化浪潮中&#xff0c;语音交互已成为人机交互的重要入口。ESP-SR作为乐鑫…...

FastAPI快速入门:环境搭建+第一个接口

FastAPI快速入门&#xff1a;环境搭建第一个接口文章信息 标题&#xff1a;FastAPI快速入门&#xff1a;环境搭建第一个接口字数&#xff1a;4200字预估阅读时间&#xff1a;18分钟难度&#xff1a;⭐☆☆☆☆一、为什么选择FastAPI&#xff1f; 在2026年的Python Web框架生态中…...

Midjourney Mud印相实战手册(含12组高保真历史文物级Mud Prompt库+对应seed校验表)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Midjourney Mud印相的技术起源与美学范式 Mud印相&#xff08;Mud Printing&#xff09;并非传统暗房工艺的直系衍生物&#xff0c;而是Midjourney V6 模型在高语义控制模式下催生的一种跨模态视觉隐喻…...

在视频剪辑工作流中集成Taotoken大模型以辅助创意构思

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 在视频剪辑工作流中集成Taotoken大模型以辅助创意构思 视频创作的前期策划阶段&#xff0c;尤其是分镜头脚本构思和文案草稿撰写&a…...

别再为FluidSIM 3.6安装报错头疼了!WinHEX找不到进程?看这篇保姆级图文教程就够了

FluidSIM 3.6安装疑难全解析&#xff1a;从报错修复到高效使用指南 当工科实验室的电脑屏幕再次弹出那个令人窒息的错误提示——"WinHEX找不到进程"&#xff0c;许多初次接触FluidSIM的师生都会陷入束手无策的困境。这款由德国Festo公司与帕德博恩大学联合开发的液压…...

OpenClaw Windows 端快速部署教程 小白实操指南

OpenClaw 一键安装包&#xff5c;一键部署&#xff0c;轻松搞定环境配置 适配系统&#xff1a;Windows10/11 64 核心优势&#xff1a;全程可视化操作&#xff0c;无需命令行、无需手动配置 Python/Node.js&#xff0c;内置所有运行依赖&#xff0c;5 分钟即可完成部署&#x…...

YouTube 视频翻译中文:基于 Whisper + FFmpeg 的自动化流水线实战

一、背景 YouTube 视频翻译中文&#xff0c;本质上是将外语视频通过语音识别&#xff08;ASR&#xff09;、文本翻译&#xff08;NMT&#xff09;、语音合成&#xff08;TTS&#xff09;三个环节处理后&#xff0c;重新合成为中文版本。每一个环节都有成熟的开源工具链支持&am…...