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

重生之我在学Vue--第2天 Vue 3 Composition API 与响应式系统

重生之我在学Vue–第2天 Vue 3 Composition API 与响应式系统

文章目录

  • 重生之我在学Vue--第2天 Vue 3 Composition API 与响应式系统
    • 前言
    • 一、Composition API 核心概念
      • 1.1 什么是 Composition API?
      • 1.2 Composition API 的核心工具
      • 1.3 基础用法示例
    • 二、响应式系统
      • 2.1 响应式工具
        • 1. `ref`
        • 2. `reactive`
        • 3. `computed`
      • 2.2 响应式系统的核心原理
      • 2.3 响应式数据的监听
        • 1. 使用 `watch`
        • 2. 使用 `watchEffect`
    • 三、案例实践:Todo 应用
      • 功能
      • 代码实现

前言

Vue 3 引入了 Composition API,它是一种新的组件逻辑组织方式,旨在解决 Vue 2 中 Options API 难以管理复杂逻辑的问题。通过 Composition API,我们可以更灵活地组织代码、复用逻辑,并充分利用 Vue 3 的响应式系统。

Vue3 官方中文文档传送点: 简介 | Vue.js

Vue3 的中文官方文档学习笔记很全还有练习场,推荐去官网学习

Vue前端成仙之路:Vue 前端成仙之路_野生的程序媛的博客-CSDN博客

GO后端成神之路:Go 后端成神之路_野生的程序媛的博客-CSDN博客


一、Composition API 核心概念

1.1 什么是 Composition API?

Composition API 是 Vue 3 提供的一组新的 API,用于定义组件的逻辑和状态。它的核心是 setup 函数,所有组件的逻辑都可以在 setup 中定义。

export default {setup() {// 在这里定义组件逻辑return {};},
};

1.2 Composition API 的核心工具

以下是 Composition API 的核心工具和它们的作用:

工具作用
ref创建响应式的基本数据类型(如字符串、数字、布尔值)。
reactive创建响应式的复杂对象(如数组、对象)。
computed创建基于其他响应式数据的计算属性。
watch监听响应式数据的变化并执行副作用。
watchEffect自动追踪响应式数据的依赖并执行副作用。
onMounted组件挂载时的生命周期钩子。
onUnmounted组件卸载时的生命周期钩子。
provide/inject实现跨组件的数据共享(类似 Vue 2 的 provide/inject)。

1.3 基础用法示例

以下是一个简单的计数器示例,展示了如何使用 refonMounted

<template><div><h1>{{ count }}</h1><button @click="increment">增加</button></div>
</template><script>
import { ref, onMounted } from 'vue';export default {setup() {const count = ref(0);const increment = () => {count.value++;};onMounted(() => {console.log('组件已挂载');});return {count,increment,};},
};
</script>

代码解析:

  1. 响应式数据 count
    • 使用 ref 创建了一个响应式数据 count,初始值为 0
    • 通过 count.value 可以访问和修改其值。
    • 在模板中,{{ count }} 会自动解包 ref 的值(无需显式加 .value)。
  2. 事件绑定
    • 使用 @click 绑定一个点击事件,当按钮被点击时,执行 increment 方法。
    • increment 方法会将 count 的值加 1,从而触发视图的更新。
  3. 生命周期钩子 onMounted
    • 使用 onMounted 生命周期钩子,在组件挂载到 DOM 后执行一些逻辑。
    • 在这里,console.log('组件已挂载') 会在浏览器控制台输出一条消息,表明组件已成功挂载。

二、响应式系统

Vue 3 的响应式系统是其核心特性之一,它通过 Proxy 对数据进行代理,从而实现数据的自动追踪和更新。

2.1 响应式工具

1. ref
  • 用于创建基本类型的响应式数据。
  • 通过 .value 访问和修改响应式数据。
import { ref } from 'vue';const count = ref(0);
console.log(count.value); // 输出 0
count.value++;
console.log(count.value); // 输出 1
2. reactive
  • 用于创建复杂类型(如对象、数组)的响应式数据。
  • 不需要通过 .value 访问属性。
import { reactive } from 'vue';const person = reactive({name: 'Alice',age: 25,
});console.log(person.name); // 输出 Alice
person.age++;
console.log(person.age); // 输出 26
3. computed
  • 用于创建基于其他响应式数据的计算属性。
  • 支持缓存,只有依赖的数据发生变化时才会重新计算。
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

2.2 响应式系统的核心原理

Vue 3 的响应式系统基于 ES6 的 Proxy 实现,主要有以下特点:

  1. 依赖追踪:当模板或计算属性使用响应式数据时,Vue 会自动追踪数据的依赖。
  2. 自动更新:当响应式数据发生变化时,Vue 会自动更新依赖该数据的视图。
  3. 懒加载:计算属性和 watch 会在需要时才执行。

2.3 响应式数据的监听

1. 使用 watch

watch 用于监听响应式数据的变化,并执行副作用。

import { ref, watch } from 'vue';const count = ref(0);watch(count, (newVal, oldVal) => {console.log(`count 从 ${oldVal} 变为 ${newVal}`);
});count.value++; // 输出:count 从 0 变为 1
2. 使用 watchEffect

watchEffect 会自动追踪响应式数据的依赖,并在数据变化时重新执行。

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

三、案例实践:Todo 应用

以下是一个简单的 Todo 应用,使用 Composition API 和 Vue 3 的响应式系统。

功能

  1. 添加任务。
  2. 删除任务。
  3. 显示任务列表。

代码实现

<template><div><h1>Todo 应用</h1><input v-model="newTask" placeholder="输入任务" /><button @click="addTask">添加任务</button><ul><li v-for="(task, index) in tasks" :key="index">{{ task }}<button @click="removeTask(index)">删除</button></li></ul></div>
</template><script>
import { ref } from 'vue';export default {setup() {const newTask = ref('');const tasks = ref([]);const addTask = () => {if (newTask.value.trim()) {tasks.value.push(newTask.value.trim());newTask.value = '';}};const removeTask = (index) => {tasks.value.splice(index, 1);};return {newTask,tasks,addTask,removeTask,};},
};
</script><style>
h1 {font-size: 24px;margin-bottom: 20px;
}
input {padding: 5px;margin-right: 10px;
}
button {padding: 5px 10px;
}
ul {list-style: none;padding: 0;
}
li {margin: 10px 0;display: flex;align-items: center;
}
</style>

代码解析:

  1. 响应式数据
  • 使用ref创建了两个响应式数据:
    • newTask:绑定到输入框,用于存储用户输入的任务内容。
    • tasks:存储任务列表的数组。
  1. 添加任务功能
  • 方法addTask
    • 检查 newTask 是否为空,避免添加空任务。
    • 使用 trim() 去除多余的空格。
    • 如果输入合法,将任务添加到 tasks 数组中,并清空输入框。
  1. 删除任务功能
  • 方法removeTask
    • 使用 splice 方法根据索引删除指定的任务。
  1. 列表渲染
  • 使用 v-for 遍历 tasks 数组,将每个任务渲染为一个列表项。
  • 使用 :key="index" 为每个列表项设置唯一的键,确保 Vue 能正确地追踪列表的变化。
  1. 双向绑定
  • 使用 v-model 将输入框的值绑定到 newTask,实现双向数据绑定。

    • 使用 trim() 去除多余的空格。
    • 如果输入合法,将任务添加到 tasks 数组中,并清空输入框。

相关文章:

重生之我在学Vue--第2天 Vue 3 Composition API 与响应式系统

重生之我在学Vue–第2天 Vue 3 Composition API 与响应式系统 文章目录 重生之我在学Vue--第2天 Vue 3 Composition API 与响应式系统前言一、Composition API 核心概念1.1 什么是 Composition API&#xff1f;1.2 Composition API 的核心工具1.3 基础用法示例 二、响应式系统2…...

【AI知识】逻辑回归介绍+ 做二分类任务的实例(代码可视化)

1. 分类的基本概念 在机器学习的有监督学习中&#xff0c;分类一种常见任务&#xff0c;它的目标是将输入数据分类到预定的类别中。具体来说&#xff1a; 分类任务的常见应用&#xff1a; 垃圾邮件分类&#xff1a;判断一封电子邮件是否是垃圾邮件 。 医学诊断&#xff1a;…...

Mysql 笔记2 emp dept HRs

-- 注意事项 -- 1.给数据库和表起名字时尽量选择全小写 -- 2.作为筛选条件的字符串是否区分大小写看设置的校对规则utf8_bin 区分 drop database if exists hrs; create database hrs default charset utf8 collate utf8_general_ci;use hrs; drop table if exists tb_emp; dro…...

MySQL和Oracle的区别

MySQL和Oracle的区别 MySQL是轻量型数据库&#xff0c;并且免费&#xff0c;没有服务恢复数据。 Oracle是重量型数据库&#xff0c;收费&#xff0c;Oracle公司对Oracle数据库有任何服务。 1.对事务的提交 MySQL默认是自动提交&#xff0c;而Oracle默认不自动提交&#xff0…...

实验12 C语言连接和操作MySQL数据库

一、安装MySQL 1、使用包管理器安装MySQL sudo apt update sudo apt install mysql-server2、启动MySQL服务&#xff1a; sudo systemctl start mysql3、检查MySQL服务状态&#xff1a; sudo systemctl status mysql二、安装MySQL开发库 sudo apt-get install libmysqlcli…...

09篇--图片的水印添加(掩膜的运用)

如何添加水印&#xff1f; 添加水印其实可以理解为将一张图片中的某个物体或者图案提取出来&#xff0c;然后叠加到另一张图片上。具体的操作思想是通过将原始图片转换成灰度图&#xff0c;并进行二值化处理&#xff0c;去除背景部分&#xff0c;得到一个类似掩膜的图像。然后…...

sql-labs(21-25)

第21关 第一步 可以发现cookie是经过64位加密的 我们试试在这里注入 选择给他编码 发现可以成功注入 爆出表名 爆出字段 爆出数据 第22关 跟二十一关一模一样 闭合换成" 第 23 关 第二十三关重新回到get请求&#xff0c;会发现输入单引号报错&#xff0c;但是注释符…...

CTF知识集-命令执行

CTF知识集-命令执行 写在开头可能会用到的提醒 ;可以用%0a来替换 是shell_exec的缩写 ls | tee 1 把ls的输出内容存入1这个文件 shell查看文件的几种方式&#xff0c;tac | more | less | tail | sort | tac | cat | head | od | expand 针对flag 可以用grep { flag.php来…...

基于米尔全志T527开发板的OpenCV进行手势识别方案

本文将介绍基于米尔电子MYD-LT527开发板&#xff08;米尔基于全志T527开发板&#xff09;的OpenCV手势识别方案测试。 摘自优秀创作者-小火苗 米尔基于全志T527开发板 一、软件环境安装 1.安装OpenCV sudo apt-get install libopencv-dev python3-opencv 2.安装pip sudo apt…...

Htpp中web通讯发送post(上传文件)、get请求

一、正常发送post请求 1、引入pom文件 <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5</version></dependency>2、这个是发送至正常的post、get请求 import org…...

【论文阅读笔记】HunyuanVideo: A Systematic Framework For Large Video Generative Models

HunyuanVideo: A Systematic Framework For Large Video Generative Models 前言引言Overview数据预处理数据过滤数据注释 模型架构设计3D Variational Auto-encoder Designtraininginference 统一的图像和视频生成架构Text encoderModel ScalingImage model scaling lawvideo …...

SpringBoot的事务钩子函数

如果需要在A方法执行完成之后做一个不影响主方法运行的动作B&#xff0c;我们需要判断这个A方法是否存在事务&#xff0c;并且使用异步执行动作B&#xff1b; import org.springframework.transaction.support.TransactionSynchronization; import org.springframework.transa…...

源码安装PHP-7.2.19

源码安装PHP-7.2.19 1.解压 tar -xjvf php-7.2.19.tar.bz2.编译 -prefix安装路径 cd php-7.2.19 ./configure --prefix/home/work/study 成功输出 3.make(构建) makemake testmake installlinux对php操作的一些命令 # 进入到php [rootvdb1 study]# cd php/ [rootvdb1 st…...

UE5制作伤害浮动数字

效果演示&#xff1a; 首先创建一个控件UI 添加画布和文本 文本设置样式 添加伤害浮动动画&#xff0c;根据自己喜好调整&#xff0c;我设置了缩放和不透明度 添加绑定 转到事件图表&#xff0c;事件构造设置动画 创建actor蓝图类 添加widget 获取位置 设置位移 创建一个被击中…...

学习日志024--opencv中处理轮廓的函数

目录 前言​​​​​​​ 一、 梯度处理的sobel算子函数 功能 参数 返回值 代码演示 二、梯度处理拉普拉斯算子 功能 参数 返回值 代码演示 三、Canny算子 功能 参数 返回值 代码演示 四、findContours函数与drawContours函数 功能 参数 返回值 代码演示 …...

(2024年最新)Linux(Ubuntu) 中配置静态IP(包含解决每次重启后配置文件失效问题)

Hello! 亲爱的小伙伴们&#xff0c;大家好呀&#xff08;Smile~&#xff09;&#xff01;我是Huazzi&#xff0c;欢迎观看本篇博客&#xff0c;接下来让我们一起来学习一下Ubuntu 中如何配置静态IP吧&#xff01;祝你有所收获&#xff01; 提前对Linux有所了解的小伙伴应该知道…...

DPDK用户态协议栈-TCP Posix API 2

tcp posix api send发送 ssize_t nsend(int sockfd, const void *buf, size_t len, __attribute__((unused))int flags) {ssize_t length 0;void* hostinfo get_host_fromfd(sockfd);if (hostinfo NULL) {return -1;}struct ln_tcp_stream* stream (struct ln_tcp_stream…...

[IT项目管理]项目时间管理(本章节3w字爆肝)

七.项目时间管理 7.1 项目进度的重要性 为什么要重视项目进度&#xff1a;在项目进行的过程之中会遇到变故。但是不论项目中发生了什么&#xff0c;时间总是在流逝&#xff0c;就可能会导致项目不可以在规定的时间完成。 7.2可能影响项目进度的因素 有员工离职个人的工作方…...

【python因果库实战5】使用银行营销数据集研究营销决策的效果5

目录 接触次数的效应 重新定义治疗变量和潜在混杂因素 更深入地审视干预情景 逆概率加权 标准化 总结及与非因果分析的比较 接触次数的效应 我们现在转而研究当前营销活动中接触次数的数量&#xff08;campaign&#xff09;对积极结果发生率的影响。具体来说&#xff0c;…...

【Qt】QWidget中的常见属性及其功能(二)

目录 六、windowOpacity 例子&#xff1a; 七、cursor 例子&#xff1a; 八、font 九、toolTip 例子&#xff1a; 十、focusPolicy 例子&#xff1a; 十一、styleSheet 计算机中的颜色表示 例子&#xff1a; 六、windowOpacity opacity是不透明度的意思。 用于设…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题&#xff0c; 因为搜索范围是有界的&#xff0c;上界最大木板长度补充的全部木料长度&#xff0c;下界最小木板长度&#xff1b; 即left0,right10^6; 我们可以设置一个候选值x(mid)&#xff0c;将木板的长度全部都补充到x&#xff0c;如果成功…...

【深度学习新浪潮】什么是credit assignment problem?

Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...