vue3记录(第一版)
vue2与vue3的区别
vue2属于选项式API,vue3属于组合式API
setup概述
setup是vue3中一个新的配置项,值是一个函数,组件中所用到的数据,方法,计算属性,监视等等,均配置在setup中
vue3中的setup和vue2的data,methods之间有什么关系呢?
因为setup比data解析的早,所以在data中可以读到setup中的数据,但是要用this指向
如果两者有冲突的话,优先于setup
setup语法糖
将setup写在script里面,则不用返回所定义的变量和函数
ref 定义基本类型的数据响应式变化
let 属性名= ref(值)
形成一个refImpl实例对象,object.defineProperty()内部的get,set进行实现
使用ref进行响应式数据的时候,数据要从value中捞取 ref也可以包裹复杂数据类型
reactive定义对象类型的数据响应式变化
reactive定义对象类型的数据变化
使用reactive定义时要修改对象中的全部属性,需要使用Object.assign(对象1,对象2)
表示将对象2中的数据全都赋给对象1 而使用ref定义的对象类型的数据可以直接赋值
区别:reactive替换整体时地址并未发生变化,而是将对象二中的属性值分别赋值给对象一中的属性
ref替换整体时采用字面量的方式进行赋值,改变了原先的地址
vue2与vue3响应式数据的区别
vue2响应数据原理:
vue2通过object.defineproperty()给每个数据都添加一个set与get,用于对数据的读取与修改
但是在对象和数组中通过索引值或者直接添加,删除的方式并不能进行响应数据页面变化
原因:因为object.defineproperty()中的set与get只控制数据的读取和修改,对于新增和删除并不理会,所以当我们通过索引值或.的方式添加数据时,不会更新页面,因为新添加的数据并没有get与set函数,删除也是同理vue3响应数据原理:
vue3很好的解决了vue2所出现的问题,使用proxy对象进行代理数据,给数据整体加上get与set,并且有对应的deleteProperty方法,用于数据的删除,get管理数据的读取,set管理数据的修改与新增,完全实现了数据的响应式变化
底层是通过Reflect反射对象,使用get,set,与deleteProperty对源数据进行操作
Reflect不会阻塞代码的正常运行(不会报错),成功返回true,失败返回false,但是通过object.defineProperty()添加的数据会阻塞代码往下运行,
使用原则
1.若需要一个基本类型的响应式数据,必须使用ref
2.若需要一个响应式对象,层级不深,ref,reactive都可以
3.若需要一个响应式对象,且层级较深,推荐使用reactive
4.ref定义的对象类型实现响应式原理底层还是借助了reactive中的proxy来实现
computed
const 变量名 = computed(() => {return 需要计算的过程
})
在vue2中我们都已经知道,方法和计算属性的区别:
- 方法需要调用才执行,可以实现和计算属性一样的效果
- 但是唯一不同是计算属性有缓存,方法并没有
- 计算属性是当它所依赖的数据发生改变的时候才会重新计算
- 而方法会在每次调用的时候就触发
计算属性一般用来通过已有的属性计算出一个新的属性,默认是只读的,通过get函数读取
当你试图修改通过计算属性得得到的值时,会收到一个警告,当需要修改计算属性值时,计算属性可以变为可修改的,需要在里面配置一个set函数,用于接收修改后的值
注意:计算属性的意义是由其他值来派生出另一个值,重点是进行计算的过程和返回结果值,要避免在其中参杂其他的逻辑(修改DOM,异步请求)
const 变量名 = computed({// getter 用于读取get() {return },// setter 用于修改set(newValue) {}
})
watch
作用:监视数据的变化
watch本质是一个函数
第一个参数,要监视的对象或属性
第二个参数是一个回调函数,参数为newValue,oldValue
第三个参数可以配置,例如开启深度监视,或者一上来就监视一次
特点:Vue3中的watch只能监视以下四种数据
1.ref定义的数据
2.reactive定义的数据
3.函数返回一个值(getter函数)
4.一个包含上述内容的数组
watch监视返回值本质上是一个函数,当需要解除监视时直接调用该函数即可
监视ref定义的基本类型数据
import {reactive, toRefs,ref,watch} from 'vue'
let sum = ref(0)watch(sum,(newValue,oldValue)=>{if(newValue > 200){//操作逻辑}
})
const changeSum = ()=>{sum.value += 100
}
监视ref定义的对象类型的基本数据
1.当使用ref定义对象类型时,监视整体时,默认监视的是person的地址值,只有当person里的值全都变化了,才可以监视的到
若是需要某一个值变化就能监测到,需要开启深度监视,但是这时新旧值都显示为新值,因为对象中的一个值改变了,并未引发地址的改变,还是原来的对象
const person =ref( {name:'hangsan',age:10
})const changeName =()=>{
person.value.name += '-'
console.log(person.value.name);
}
const changeAge =()=>{
person.value.age += 1
}
const changeALL =()=>{
person.value = {name:'lisi',age:111} // 直接通过字面量赋值的方式修改,地址变化了
}
watch(person,(newValue,oldValue)=>{ console.log(newValue,oldValue,'2');
},{deep:true})
2.当使用reactive定义对象数据类型的数据时,会隐式地创建一个深层侦听器,监视时默认开启深度监视,即对象中的一个值变化就会触发监视
const person =reactive( {name:'hangsan',age:10
})const changeName =()=>{
person.name += '-'
console.log(person.name);
}
const changeAge =()=>{
person.age += 1
}
const changeALL =()=>{
Object.assign(person,{name:'wasa',age:12}) //里面值都变了,但是地址并未变化
}
watch(()=>person.name,(newValue,oldValue)=>{console.log(newValue,oldValue,'1');
})
watch(person,(newValue,oldValue)=>{ console.log(newValue,oldValue,'2'); //newValue,oldValue两者的值相同,因为他们是一个对象(地址未变)
})
监视ref或者reactive定义的对象类型中的某一个属性
const person =reactive( {name:'hangsan',age:10
})const changeName =()=>{
person.name += '-'
console.log(person.name);
}
const changeAge =()=>{
person.age += 1
}
const changeALL =()=>{
Object.assign(person,{name:'wasa',age:12})
}
watch(()=>person.name,(newValue,oldValue)=>{console.log(newValue,oldValue,'1');
})
当监视ref或者reactive定义的对象类型中的某一个值时,watch函数的第一个参数为监视的值,不能直接写对象.属性名
因为此时获取的是对象中的一个数据值,并不符合watch所监视的四种情况中的一种
这时需要使用get函数来返回所要监视的对象中的属性值
若该属性不是对象类型,则需要写成get函数
若该属性是对象类型:
可直接写,若直接写当整个对象发生变化时监测不到,因为watch监测的只是原对象,当整体改变时,相当于原对象已经不存在了,换成了另一个全新的对象
也可写成函数式,不会出现上述情况
监视多个属性
// 多个来源组成的数组
watch([x, () => y.value], ([newX, newY],[oldX, oldY]) => {console.log(`x is ${newX} and y is ${newY}`)
})
当监视多个时,使用数组包裹,只要有一个数据变化时会触发监视,newValue和oldValue值相同,且都为数组
watchEffect
let sum = ref(0)
let count = ref(20)
//使用watch监视属性,当达到某个限制时实现相应逻辑watch([sum,count],(value)=>{ let [sum,count] = valueif(sum>40){console.log('111');}
})
//使用watchEffect监视属性,当达到某个限制时实现相应逻辑
watchEffect(()=>{if(sum.value > 40 || count.value > 40){console.log('111');}
})
const changeSum = ()=>{sum.value += 20
}
const changeCount = ()=>{count.value += 10
}
watchEffect会自动在逻辑中识别所要监视的属性,不用再像watch那样再标明所要监视的属性
ref
加在html标签上可以获取当前的DOM元素
但是加在组件身上,获取的是一个组件实例,并不会看到这个组件身上的东西,产生保护机制
若想看到,组件要暴露defineExpose,defineExpose({想给别人看的属性})
这样父组件调用的时候才能看到这些属性
hook钩子函数
hook 本质是一个函数,把setup函数中使用的Composition API进行了封装
其实是将vue中的数据与方法进行进一步模块化,将一个功能的数据与方法放到同一个文件中,类似于vue2中的minxin
命名使用use与功能名进行拼接,文件内使用函数包裹功能向外界暴露,函数内将其数据与函数return出
在主文件中引入,使用hook暴露出的函数,让代码的逻辑更加清楚易懂
toRef
作用:将响应式对象中的指定属性值包装成为一个ref响应式数据,该响应式数据的值指向先前对象中的值
语法:const 属性名 = toRef(对象名,‘属性名’)
应用:将对象中的值单独提供给外部使用时,可以实现原对象的 数据与新包装成的ref数据的联动响应
let person = reactive({name:'zhangsan',age:11
})
let age =toRef(person,'age')
let name =toRef(person,'name')const updateName = ()=>{name.value += '_'
}
const updateAge = ()=>{age.value += '_'
}
对象数据类型的响应式原理是依靠proxy来实现的,通过内部的get与set函数来实现对数据的读取和修改,实现数据与页面的一致,当使用toRef()将对象中的数据转化为ref实例对象时,实例对象的get与set会指向原对象的get与set,当原对象中该属性值发生变化时,该实例对象也会发生变化,同理实例对象发生变化时,原对象也会发生变化,从而会实现了两个数据的同步
toRefs
toRefs和toRef作用一样,不同点是前者将对象中的每一个都创建为了ref对象,后者是有选择的
适用于多个使用对象中的数据的场景
let person = reactive({name:'zhangsan',age:11
})
let { name,age} =toRefs(person)
const updateName = ()=>{name.value += '_'
}
const updateAge = ()=>{age.value += '_'
}
console.log(name,age);
toRaw与markRow
toRaw: 作用:将一个由reactive生成的响应式对象转为普通对象。
使用场景:用于读取响应式对象对应的普通对象,对这个普通对象的所有操作,不会引起页面更新。
markRaw:
作用:标记一个对象,使其永远不会再成为响应式对象。
应用场景:
1.有些值不应被设置为响应式的,例如复杂的第三方类库等。
2.当渲染具有不可变数据源的大列表时,跳过响应式转换可以提高性能。
vue2&vue3(difference)
vue2中父组件通过props向子组件传递数据,但当子组件不接收时,就将数据暂时储存在$attrs上,当子组件使用props接收时,就将数据挂载在组件实例身上
setup函数的执行时机比beforeCreated还要早,this为undefined,所有vue3中不存在this
setup函数接收两个参数,props和context props:外部传递过来的数据且组件声明接收过的放在props上
context:attrs:外部组件传递过来数据,但组件没有声明接收的会放在这里,和vue2$attrs一样
emit:给子组件绑定自定义事件,必须在子组件中使用emits声明下绑定的是什么事件,相当于vue2$emits
slots:插槽,具名插槽需要用v-slot:名字,$slots
相关文章:

vue3记录(第一版)
vue2与vue3的区别 vue2属于选项式API,vue3属于组合式API setup概述 setup是vue3中一个新的配置项,值是一个函数,组件中所用到的数据,方法,计算属性,监视等等,均配置在setup中 vue3中的setup和vue2的data,methods之间有什么关系呢? 因为setup比data解析的早,所以在data中可以…...
R 语言数据导入与导出
R 语言数据导入与导出 数据的导入和导出是数据处理中的重要步骤。R 语言提供了多种方法来读取和写入不同格式的数据文件,包括 CSV、Excel、JSON、SQL 数据库等。本文将介绍如何在 R 语言中进行数据的导入和导出。 1. 导入数据 1.1 读取 CSV 文件 CSV(C…...
kubectl常用命令简介
在之前浅谈Kubernetes集群架构 中介绍了kube-apiserver是提供k8s对内或对外的api请求的唯一入口,本文介绍的 kubectl 是官方的CLI命令行工具,用于与 apiserver 进行通信,将用户在命令行输入的命令,组织并转化为 apiserver 能识别的…...

【小白学机器学习31】 大数定律,中心极限定理,标准正态分布与概率的使用
目录 1 正态分布相关的2个相关定理 1.1 大数定律:(证明了)分布的稳定性 1.2 中心极限定理:(证明了)分布的收敛性 2 使用标准差和概率的2种思路 2.1 标准正态分布的曲线 2.2 两种使用方式 2.3 第1种:按整数倍标准差δ 作为标准使用 2.…...

Go语言基础语法
一、创建工程 说明: (1)go.mod文件是go项目依赖管理文件,相当于前端的package.json,也就是Java项目中的Maven的pom.xml。 二、打印数据到控制台 (1)引入fmt (2)使用fmt…...
CSS层叠/CSS变量和!important的使用
layer components {:root {--theme: red;font-family: serif !important;} } CSS Layers CSS Layers 是一种用于管理和组织样式规则的新机制。它允许开发者定义不同的样式层,以便更好地控制样式的优先级和覆盖关系。通过使用 layer 规则,开发者可以将样…...

提升工作效率的小众神器
🤖宝子们,今天我要给大家分享五款超实用的小众工作软件,让你的工作事半功倍!😎 🌟亿可达 - 自动化办公神器 亿可达是一款自动化办公工具,无需编程知识就能搭建出各种自动化工作流程。界面清新…...

【Python+Pycharm】2024-Python安装配置教程
【PythonPycharm】2024-Python安装配置教程 一、下载装 Python 1、进入Python官网首页,下载最新的Python版本 Download Python | Python.org 选择对应版本下载 安装 测试安装情况 python如果安装失败 在系统环境变量添加安装路径 where pythonwin7安装路径添加…...

systemverilog中clocking的用法
文章目录 1.clocking简介2.clocking实例分析3.重点分析(1)bus定义是不是随便取名的(2)输入输出的定义原则是什么(3)到底如何消除了竞争和冒险(4)没用到的信号如何处理(5&…...
【Python开发】大模型应用开发项目整理
不知不觉已经入职3个月了,同事很好,工作充实,学到了很多东西,大大小小的需求也实现了接近20个。负责2个主要component,数据抓取和利用GenAI做数据提取。 1 背景 提取新闻中事件关键信息,比如人名ÿ…...

Redis 的使⽤和原理
第一章:初识 Redis 1.1盛赞 Redis Redis 是⼀种基于键值对(key-value)的 NoSQL 数据库,与很多键值对数据库不同的是,Redis 中的值可以是由 string(字符串)、hash(哈希)、list&…...
前端学Java
一:语法 1、注解 注解(Annotation)是Java中的一种特殊类型的语法,它可以被用来为代码提供元数据。元数据是关于数据的数据,注解可以用于类、方法、变量等的描述与标记。 理解注解可以从以下几个方面入手:…...
VR游戏:多人社交将是VR的下一个风口
第一部分:创业笔记 1. 市场趋势 从单机游戏转向多人互动体验:随着技术的进步,VR游戏正从单机模式向多人互动体验转变。代表作品如Rec Room、Phasmophobia、Among Us和Breachers等,这些游戏的成功证明了多人互动模式的巨大潜力。…...
Docker与虚拟机(VM)的不同
Docker与虚拟机(VM)在实现的原理上存在显著的不同,主要体现在以下几个方面: 一、基础原理 Docker 利用Linux内核的特性,如容器(containers)、命名空间(namespaces)和控制…...

Pr 视频效果:透视
效果面板/视频效果/透视 Video Effects/Perspective Adobe Premiere Pro 的视频效果中,透视 Perspective效果组主要用于在二维平面的视频剪辑中模拟三维空间的透视效果。 通过调整这些效果,可以改变图像的视角、添加阴影、创造立体感,增强画面…...
C 语言标准库 - <limit.h>
简介 <limits.h> 是 C 标准库中的一个头文件,定义了各种数据类型的限制。这些宏提供了有关整数类型(char、short、int、long 和 long long 等)和其他数据类型的最大值和最小值的信息。 这些限制指定了变量不能存储任何超出这些限制的…...

Python | Leetcode Python题解之第519题随机翻转矩阵
题目: 题解: class Solution:def __init__(self, m: int, n: int):self.m mself.n nself.total m * nself.map {}def flip(self) -> List[int]:x random.randint(0, self.total - 1)self.total - 1# 查找位置 x 对应的映射idx self.map.get(x,…...

大数据新视界 -- 大数据大厂之提升 Impala 查询效率:索引优化的秘籍大揭秘(上)(3/30)
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

【AI工作流】FastGPT - 深入解析FastGPT工作流编排:从基础到高级应用的全面指南
文章目录 一、工作流编排概述二、FastGPT的节点类型1. 基础功能插件(1) 文本输出(2) 功能调用(3) 工具(4) 外部调用(5) 其他 2. 系统插件3. 团队插件 三、工作流中的流向结语 在当今快速发展的人工智能领域,工作流编排的能力已成为提升用户体验和应用效率的关键因素…...

VS+Qt解决提升控件后,包含头文件格式不对问题处理
一、前言 VSQt 提升控件后,在uic目录下会生成ui相关的初始化文件,对于提升的控件头文件包含的格式为#include<> 而非 #include “ ” 导致无法找到头文件。如果手动修改为 #include “ ”相当麻烦,甚至每次编译都要修改一遍,…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...