尚硅谷Vue3入门到实战,最新版vue3+TypeScript前端开发教程

Vue3

编码规范

创建vue3工程

基于vite创建

快速上手 | Vue.js (vuejs.org)

npm create vue@latest

在nodejs环境下运行进行创建

按提示进行创建

用vscode打开项目

安装依赖

源文件有src

内有main.ts  App.vue

简单分析

编写src

vue2语法在三中适用

vue2中的date  methods语法是

选项式API

setup

setup函数执行的时机

setup执行时机比vue2中的beforecreate还要早

setup函数中的this是undefined      vue3中已经开始弱化this

数据原来是写在data中的 ,此时的name、age、tel都不是响应式数据

即,通过下面的方法修改变量,  变量虽然改变,但页面没有变化

setup返回值

小小面试题

Vue3中使用setup和使用data     methods  

setup和optionAPI的关系

data(methods    下文data代指vue2旧写法)和setup可以同时存在

且  data中可以访问setup中的数据,通过this关键字

旧写法可以读取新写法中的东西

新写法无法读取旧写法中的东西

vue2中选项式语法可以和vue3 中的新语法setup共存

旧语法可以读出setup中的东西,setup不可以读出旧语法中的东西

setup语法糖

省去每次将return放出去数据方法的步骤

这个script标签是用来配置组件名字

这个script标签用来配置组合式API

此时有两个script标签,且两个标签的lang属性一致

此时只需要在setup 的script标签内随意写数据和方法

若想要将这两个script标签写在一个内

需要借助插件完成

安装插件

1.npm i vite-plugin-vue-setup-extend -D

-D 是开发依赖的意思

2.修改vite.config.ts文件

响应式数据

ref定义基本类型 的数据

想让哪个数据成为响应式数据,就给那个数据包裹ref()

模板中不需要.value

js中进行数据操作,需要通过.value调用

name不是响应式的,name.value是响应式的

此时 的 被ref()包裹的name age为refImpl对象

reactive定义对象类型的数据

被reactive包裹的对象类型数据转变为响应式对象数据

通过控制台输出响应式对象可知,为proxy代理对象(数组)  proxy为原生js就有的,叫做代理

原生内置的函数

reactive所定义的对象类型的响应式数据是深层次的 

ref与reactive

表面上是ref定义对象类型数据改为响应式数据,实际上ref遇见对象数组等非基本数据类型,底层是通过reactive实现的

reactive重新分配一个新对象,会失去响应式

此时要是使用object.assign 替换

也就是说重新上传一个新对象,不能直接对进行了响应式改变的对象直接更改对象

而是通过object的assign 方法实现对象的覆盖

ref可以通过.value 直接修改对象

toRefs和toRef

把一个响应式结构中的属性拿出来并且使其具备响应式

toRefs 将对象内的属性可以多个同步取出并进行ref响应式

toRef(对象,对象其中的一个属性名)

toRefs(对象)

toRefs解构对象,toRef解构对象的某个属性

计算属性

根据已有数据计算出新数据

input表单中的属性

v-bind:   单向绑定

v-model:双向绑定

方法没有缓存

计算属性有缓存

在多次调用fullName是,如果firstName和LastName未改变,则计算属性执行一次

slice截取

val.split(‘-’)根据这个字符分开成为一个数组

.toUpperCase()字母大写的方法

计算属性最终得到的也是一个ref响应式数据

在对fullName进行修改时  .value 修改 的值会在set方法中返回给val

Watch

3.getter函数

Watch监视-情况一

监视ref定义的 基本类型数据

Watch监视-情况二

若想要监视对象内部属性的变化,需要手动开启深度监视

 

如果修改的是对象中的属性,因为所更改的是旧的对象中的属性,所以oldvalue为原本的对象,又因为更改后的属性所对应的还是旧属性,所以newvalue所对应的也是原本更改了属性的对象,所以这种写法下,仅修改属性值,而不修改整个对象的话,oldvalue和newvalue是相同的

实际使用中通常不使用旧值 

 Watch监视-情况三

如果监视的是reactive所定义的数据,底层隐式地创建了深层的监听

 Watch监视-情况四

监视的属性为基本数据类型

getter函数,一个函数返回一个值

监视的属性为对象数据类型

如果直接写对象的这个对象类型的属性,只能监视,这个对象类型数据内部的变化,整体对象的改变无法监视

写函数式返回 这个对象数据类型的属性  返回的是地址值,只有当这个属性整个对象改变时,才会监视,触发监视函数

中和方案:采用函数书写,添加深度监视属性

 Watch监视-情况五

监视上述多个数据

watchEffect

watch  监视 多个数据 需要将多个数据指出

watchEffect   不用明确指出监视的数据(函数中用到哪些属性,那就监视哪些属性)

标签的ref属性

用于给节点打标识

如何调用dom标签,使用id调用难免会出现 俩个vue文件中出现标有相同id的html标签

所以此时通过ref在  模版中的html标签内打上ref标签,内写上名字,再在js板块写

名字=ref()即可实现调用dom元素,且不会出现两个id重复的情况

ref加在html标签上,得到的是dom元素

加载组件上,得到的是组件的实例对象,但暴露出的数据需要再组件的vue内进行修改

ref写在组件标签上,,最终能获取组件实例

由于具有保护措施,,打印出的组件实例,没有实质的内容,

此时需要在   组件源文件,儿子端,内调用defineExpose设置暴露给父级的东西

scoped局部样式无脑加

其他vue文件就再也不怕类名起重复了

回顾TS中的_接口_泛型_自定义类型

TS接口规范的使用

@符在文件路径时使用,指站在金字塔顶端

限制Persons数组时

使用泛型

泛型什么时候用什么时候写

自定义类型

props的使用

从父级传数据

reactive直接传泛型

defineProps  函数用于接受数据

标签内传入数据的值

传入数据时,在html标签中遇到的问题    :与否  决定是表达式还是简单的字符

vue中的遍历   

数据源中每一项(形参)    数据源

还应添加索引值     key     :key可以进行对索引值的 赋值,避免后面遍历的时候出现问题

没有key索引值为0-1-2-。。。。。

props的几种写法

define为前缀的函数表示该函数为宏函数

不用引入也可以直接使用

生命周期(组件的一生)

Vue2的生命周期

v-if既然不展示,结构给删了

v-show       结果还在

debugger()

Vue3的生命周期

创建在setup这个中

挂载

挂载前onBeforeMount()

挂载完毕onMounted()

更新

更新前onBeforeUpdate

更新完毕onUpdate()

卸载

卸载前onBeforeUnmount()

卸载完毕onUnmounted()

 最基本八个生命周期

自定义Hooks

Hooks:

mixin

命名:useDog   (与狗相关的) useXX  与XX相关的一部分内容  被模块化包装

Hooks的调用

Hooks本质是一个个可以调用的函数

Hooks内能写钩子(生命周期函数)

   

组合式API          Hooks实现相关内容(数据函数等)模块化,整合到一起

export default  后面直接跟值

路由(route)

就是一种对应关系

1.路由就是一组key-value的对应关系

2.多个路由需要经过路由器的管理

spa        应用    单页面应用 需要使用路由

路由_基本切换效果

第一步写出导航区,和展示区

第二步  请出路由器

制定路由的时候  一定要想好路由器的工作模式

制定好路由后一定要暴露router

并在main.ts引入router

并使用路由器

此时已经具备路由环境

还应在App。vue文件中添加可视路由模块

路由_两个注意点

路由_路由器工作模式

to的两种写法

命名路由

路由嵌套

添加子级路由不用填/

路由传参  query参数

从一个响应式上解构一个属性,这个属性丢失响应式

params参数

占位问题

params不能传对象和数组

params       

不能用path只能用name

路由的props配置

第一种写法:将路由收到的所有params参数作为props传给路由组件      只能params参数使用

第二种写法:函数写法

更加适合query参数,因为params参数用第一种方法更加简单

第三种写法:无法进行修改,只有固定数据,使用较少

replace

跳转的时候有两种方式

push  会有历史记录,能够后退

导航区加replace    不能够后退

编程式路由导航

脱离routerLink实现跳转页面

router.push()写法                 routerLink 中 to能写什么

重定向

作用:将特定的路径,重新定向到已有路由。

通常写在路由设置最下面

pinia

vue.js状态管理库

自己定义的ref,需要.value拆包

如果是reactive里面包了一个ref,自动拆包,不需要再.value就能获取值

5.4修改数据的三种方式

第一种:直觉修改

 

工具中可以看到

第二种:patch批量变更

patch批量变更,在时间线上,多个数据单个修改      组件会进行多次修改

                                                    而使用第二种修改方式    组件只会进行一次patch修改

批量变更

第三种:action

storeToRefs

读取store数据更加优雅

storeToRefs只关心数据不关心其他的

而使用toRefs会使内部所有属性被ref包裹

getters的使用

对stroe数据不满意,对其进行修改

如果用this,不能使用箭头函数

订阅subscribe可以监视vueX的修改

只要是store  身上都有这个subscribe方法

localStorage.setItem('talkList',state.talkList)//浏览器的本地存储

localStorage里面存的都是字符串,如果存的不是字符串

,底层会调用toString

store组合式写法

选项式

组合式

组件通信

UomgAPI

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

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

相关文章

UnityECS学习中问题及总结entityQuery.ToComponentDataArray和entityQuery.ToEntityArray区别

在Unity的ECS&#xff08;Entity Component System&#xff09;开发中&#xff0c;entityQuery.ToComponentDataArray<T>(Allocator.Temp) 和 entityQuery.ToEntityArray(Allocator.Temp) 是两种不同的方法&#xff0c;用于从实体查询中获取数据。除了泛型参数之外&#…

【深度学习入门篇 ⑤ 】PyTorch网络模型创建

【&#x1f34a;易编橙&#xff1a;一个帮助编程小伙伴少走弯路的终身成长社群&#x1f34a;】 大家好&#xff0c;我是小森( &#xfe61;ˆoˆ&#xfe61; ) &#xff01; 易编橙终身成长社群创始团队嘉宾&#xff0c;橙似锦计划领衔成员、阿里云专家博主、腾讯云内容共创官…

git、huggingface 学术加速

1、git 有时候服务器不能直接访问 github&#xff0c;下载代码会很麻烦&#xff1b;安装库的时候&#xff0c;pip xx git 就更难了 比如&#xff0c;这次我需要安装 unsloth&#xff0c;官方给出的脚本是&#xff1a; pip install “unsloth[cu121-torch220] githttps://git…

【python】函数重构

函数重构 函数重构pycharm函数重构步骤函数重构练习 函数重构 函数重构是指对现有函数进行修改和优化的过程。重构的目的是改善代码的可读性、可维护性和灵活性&#xff0c;同时保持其功能不变。函数重构通常包括以下步骤&#xff1a; 理解函数的功能和目的。了解函数的作用和…

OSPF.综合实验

1、首先将各个网段基于172.16.0.0 16 进行划分 1.1、划分为4个大区域 172.16.0.0 18 172.16.64.0 18 172.16.128.0 18 172.16.192.0 18 四个网段 划分R4 划分area2 划分area3 划分area1 2、进行IP配置 如图使用配置指令进行配置 ip address x.x.x.x /x 并且将缺省路由…

Sortable.js板块拖拽示例

图例 代码在图片后面 点赞❤️关注&#x1f64f;收藏⭐️ 页面加载后显示 拖拽效果 源代码 由于js库使用外链&#xff0c;所以会加载一会儿 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name&qu…

【Go系列】 Go的错误处理

承上启下 上一篇文章中介绍了struct和interface&#xff0c;在Go语言中&#xff0c;是没有Class这个概念的&#xff0c;我们可以通过Struct和方法的组合&#xff0c;来实现Class。我们通过Struct嵌套来实现继承这样的一种机制&#xff0c;并且不用设置虚函数这样的特殊说明。同…

如何防止第三方DLL注入自己的进程?

PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY 结构 struct _PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY {union {DWORD Flags;struct {DWORD MicrosoftSignedOnly : 1;DWORD StoreSignedOnly : 1;DWORD MitigationOptIn : 1;DWORD AuditMicrosoftSignedOnly : 1;DWORD Audit…

C语言 ——— 实用调试技巧(Visual Studio)

目录 Debug 和 Release 的区别 F10 --- 逐过程调试 & F11 --- 逐语句调试 F9 --- 新建/切换断点 & F5 --- 开始调试 shift F5 & ctrl F5 Debug 和 Release 的区别 Debug&#xff1a;通常为调试版本&#xff0c;它包含调试信息&#xff0c;并且不作任何优化…

一 GD32 MCU 开发环境搭建

GD32 系列为通用型 MCU &#xff0c;所以开发环境也可以使用通用型的 IDE &#xff0c;目前使用较多的是 KEIL、 IAR 、 GCC 和 Embedded Builder &#xff0c;客户可以根据个人喜好来选择相应的开发环境。 目录 1、使用 Keil 开发 GD32 目前市面通用的MDK for ARM版本有Kei…

华为OD机试真题2024版-路口最短时间问题

题目描述 假定街道是棋盘型的&#xff0c;每格距离相等&#xff0c;车辆通过每格街道需要时间均为 timePerRoad&#xff1b; 街道的街口&#xff08;交叉点&#xff09;有交通灯&#xff0c;灯的周期 T(lights[row][col]) 各不相同&#xff1b; 车辆可直行、左转和右转&…

企业网三层架构

企业网三层架构&#xff1a;是一种层次化模型设计&#xff0c;旨在将复杂的网络设计分成三个层次&#xff0c;每个层次都着重于某些特定的功能&#xff0c;以提高效率和稳定性。 企业网三层架构层次&#xff1a; 接入层&#xff1a;使终端设备接入到网络中来&#xff0c;提供…

Python爬虫教程第二篇:进阶技巧与实战案例

Python爬虫教程第二篇&#xff1a;进阶技巧与实战案例 在上一篇教程中&#xff0c;我们学习了Python爬虫的基础概念、基本流程以及一个简单的入门实践案例。本篇教程将带领大家进一步探索Python爬虫的进阶技巧&#xff0c;并提供一个实战案例&#xff0c;帮助大家提升爬虫技能…

Android12 MultiMedia框架之GenericSource extractor

前面两节学习到了各种Source的创建和extractor service的启动&#xff0c;本节将以本地播放为例记录下GenericSource是如何创建一个extractor的。extractor是在PrepareAsync()方法中被创建出来的&#xff0c;为了不过多赘述&#xff0c;我们直接从GenericSource的onPrepareAsyn…

Mojolicious命令行工具:自动化Web开发的瑞士军刀

Mojolicious是一个高性能的、基于Perl的Web开发框架&#xff0c;它提供了一整套工具来简化Web开发流程。其中&#xff0c;Mojolicious的命令行工具集是其强大功能的一部分&#xff0c;允许开发者快速生成项目模板、运行开发服务器、执行各种开发任务等。本文将详细介绍Mojolici…

qt 自定义信号号槽 简单举例

在Qt中&#xff0c;自定义信号和槽是一种非常灵活的方式来处理对象之间的通信。以下是一个简单的例子&#xff0c;展示了如何定义和使用自定义的信号和槽。 首先&#xff0c;我们定义一个名为MyClass的类&#xff0c;该类继承自QObject&#xff0c;并声明一个自定义信号和一个…

13_Shell系统函数

13_Shell系统函数和自定义函数 一、系统函数 basename 获取文件名 #!/bin/bash#basename 相对路径文件名 basename ./1.sh#basename 绝对路径文件名 basename /tmp/1.sh#basename 去除文件后缀名 basename /tmp/1.sh .shdirname 获取文件所在目录名 #!/bin/bash#dirname 相对路…

Redis持久化RDB,AOF

目 录 CONFIG动态修改配置 慢查询 持久化 在上一篇主要对redis的了解入门&#xff0c;安装&#xff0c;以及基础配置&#xff0c;多实例的实现&#xff1a;redis的安装看我上一篇&#xff1a; Redis安装部署与使用,多实例 redis是挡在MySQL前面的&#xff0c;运行在内存…

Week 6-杨帆-学习总结

- 46 语义分割和数据集 语义分割概念 语义分割是一种计算机视觉任务&#xff0c;其目标是将图像分割成属于不同语义类别的区域。与目标检测不同&#xff0c;语义分割关注的是像素级别的标注和预测&#xff0c;能够识别并理解图像中每一个像素的内容。这使得语义分割在理解图像…

产品经理-研发流程-敏捷开发-迭代-需求评审及产品规划(15)

敏捷开发是以用户的需求进化为核心&#xff0c;采用迭代、循序渐进的方法进行软件开发。 通俗来说&#xff0c;敏捷开发是一个软件开发流程&#xff0c;是一个采用了迭代方法的开发流程 简单来说&#xff0c;迭代就是把一个大产品拆分出一些最小的实现单位。完成不同的迭代就最…