cos 足交

你的位置:校园春色 > cos 足交 > 91porn vip Vue3学习条记(二)——组合式API(Composition API)

91porn vip Vue3学习条记(二)——组合式API(Composition API)

发布日期:2024-08-26 04:47    点击次数:118

91porn vip Vue3学习条记(二)——组合式API(Composition API)

一、常用 Composition API

官方文档: https://v3.cn.vuejs.org/guide/composition-api-introduction.html91porn vip

组合式 API (Composition API) 是一系列 API 的蚁集,使咱们不错使用函数而不是声明选项的神气书写 Vue 组件。它是一个综合性的术语,涵盖了以下方面的 API:

反映式 API:举例 ref() 和 reactive(),使咱们不错平直创建反映式气象、野心属性和侦听器。

生命周期钩子:举例 onMounted() 和 onUnmounted(),使咱们不错在组件各个生命周期阶段添加逻辑。

依赖注入:举例 provide() 和 inject(),使咱们不错在使用反映式 API 时,应用 Vue 的依赖注入系统。

组合式 API 是 Vue 3 及 Vue 2.7 的内置功能。关于更老的 Vue 2 版块,不错使用官方珍藏的插件 @vue/composition-api。在 Vue 3 中,组合式 API 基本上王人会妥洽 <script setup> 语法在单文献组件中使用。底下是一个使用组合式 API 的组件示例:

天然这套 API 的作风是基于函数的组合,但组合式 API 并不是函数式编程。组合式 API 是以 Vue 中数据可变的、细粒度的反映性系统为基础的,而函数式编程平淡强调数据不可变。

要是你对如何通过组合式 API 使用 Vue 感敬爱,不错通过页面左侧边栏上方的开关将 API 偏好切换到组合式 API,然后从新重新阅读带领。

1.1.setup

理会:Vue3.0中一个新的建设项,值为一个函数。

setup是扫数Composition API(组合API)“ 扮演的舞台 ”。

组件中所用到的:数据、举止等等,均要建设在setup中。

setup函数的两种复返值:

若复返一个对象,则对象中的属性、举止, 在模板中均不错平直使用。(要点怜惜!)

若复返一个渲染函数:则不错自界说渲染本色。(了解)

精细点:

尽量不要与Vue2.x建设混用

Vue2.x建设(data、methos、computed...)中不错拜访到setup中的属性、举止。

但在setup中不可拜访到Vue2.x建设(data、methos、computed...)。

要是有重名, setup优先。

setup一般不可是一个async函数,因为复返值不再是return的对象, 而是promise, 模板看不到return对象中的属性。(后期也不错复返一个Promise实例,但需要Suspense和异步组件的妥洽)

简化的setup函数:

复返一个渲染函数,注长入替换页面中的本色,很少使用,慎用。

 

文本与按钮被替换了。

Vue3兼容无数Vue2的本色

不错混用,但不提倡这样作念

 

 

 Vue2.x建设(data、methos、computed...)中不错拜访到setup中的属性、举止。

 

 

 

 但在setup中不可拜访到Vue2.x建设(data、methos、computed...)。

 

 

 

 

 

 要是有重名, setup优先。

 

 setup一般不可是一个async函数

1.2.ref函数

作用: 界说一个反映式的数据

语法: const xxx = ref(initValue)

创建一个包含反映式数据的援用对象(reference对象,简称ref对象)。

JS中操作数据: xxx.value

模板中读取数据: 不需要.value,平直:<div>{{xxx}}</div>

ref对应的接口是interface Ref<T>

备注:

接受的数据不错是:基本类型、也不错是对象类型,不提倡使用对象数据类型。

基本类型的数据:反映式还是是靠Object.defineProperty()的get与set完成的。

对象类型的数据:里面 “ 乞助 ” 了Vue3.0中的一个新函数—— reactive函数。

isRef 判断是不是一个ref对象

底下的示例运行时莫得更新姓名

其实user的值是修改了,然而莫得反映式的更新视图

 原因是此时的user是一个非反映式对象,使用ref不错惩办问题

1.3.reactive函数

作用: 界说一个对象类型的反映式数据(基本类型不要用它,要用ref函数)

语法:const 代理对象= reactive(源对象)接受一个对象(或数组),复返一个代理对象(Proxy的实例对象,简称proxy对象)

reactive界说的反映式数据是“深脉络的”。

里面基于 ES6 的 Proxy 杀青,通过代理对象操作源对象里面数据进行操作。

基本使用:

reactive界说的反映式数据是“深脉络的”。

1.4.Vue中的反映式旨趣 1.4.1.vue2.x的反映式

使用 Object 构造函数上的 defineProperty() 杀青。

1、vue2存在的问题

新增属性、删除属性,界面不会更新。

View Code

平直通过下标修改数组,界面不会自动更新。

View Code

精细:要是要惩办上述问题

① 使用 vue 实例对象上的 $set 进行添加或修改,$delete 进行删除。 ② 使用 Vue.set 进行添加或修改,Vue.delete 进行删除。 ③ 使用 vue 实例对象上的 $nextTick 进行页面更新。 ④ 使用数组的一些举止对数组进行操作(如 splice() )。

2、杀青反映式的旨趣

对象类型:通过 Object.defineProperty() 对属性的读取、修纠正行禁锢(数据劫捏)。

数组类型:通过重写更新数组的举止来杀青禁锢(对数组的变更举止进行了包裹)。

(1)Object.defineProperty() 的基本使用

使用defineProperty从新界说属性name,拜访时更新界面

使用闭包调用参数中的value,不再界说外部变量

上头的代码如故有颓势,要是变量相比多,则需要一个个界说,缺乏,不错使用轮回 

上头的杀青如故有问题,不可深脉络的对象插足监听,举例:

View Code

 

莫得从新界说city,set时莫得被禁锢,使用递归不错惩办该问题,无缺代码

(2)杀青代码

1.4.2.Vue3反映式旨趣

杀青旨趣:

通过Proxy(代理): 禁锢对象中任意属性的变化, 包括:属性值的读写、属性的添加、属性的删除等。

通过Reflect(反射): 对源对象的属性进行操作。

MDN文档中形容的Proxy与Reflect:

Proxy:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Proxy

Reflect:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Reflect

new Proxy(data, {    // 禁锢读取属性值    get (target, prop) {        return Reflect.get(target, prop)    },    // 禁锢设立属性值或添加新属性    set (target, prop, value) {        return Reflect.set(target, prop, value)    },    // 禁锢删除属性    deleteProperty (target, prop) {        return Reflect.deleteProperty(target, prop)    }})​proxy.name = 'tom'   

(1)、反射 Reflect

Reflect是ES6中新增多的一个对象,并非构造器,该对象中含有多个可完成"元编程(对编程说话进行编程)"功能的静态函数,能便捷的对对象进行操作,也不错集中Proxy杀青禁锢功能

https://www.cnblogs.com/best/p/16291079.html#_lab2_4_0

(2)、代理Proxy

浅层代理:

深层代理 

Vue3中的反映式神气惩办Vue2中莫得惩办的问题:

归来:

1.5.reactive对比ref

从界说数据角度对比:

ref用来界说:基本类型数据。

reactive用来界说:对象(或数组)类型数据。

备注:ref也不错用来界说对象(或数组)类型数据, 它里面会自动通过reactive转为代理对象。

从旨趣角度对比:

ref通过Object.defineProperty()的get与set来杀青反映式(数据劫捏)。

reactive通过使用Proxy来杀青反映式(数据劫捏), 并通过Reflect操作源对象里面的数据。

从使用角度对比:

ref界说的数据:操作数据需要.value,读取数据时模板中平直读取不需要.value。

朴妮唛全集

reactive界说的数据:操作数据与读取数据:均不需要.value。

1.6.setup的两个精细点

setup膨胀的时机

在beforeCreate之前膨胀一次,this是undefined。

setup的参数

props:值为对象,包含:组件外部传递过来,且组件里面声明接受了的属性。

context:高下文对象

attrs: 值为对象,包含:组件外部传递过来,但莫得在props建设中声明的属性, 至极于 this.$attrs。

slots: 收到的插槽本色, 至极于 this.$slots。

emit: 分发自界说事件的函数, 至极于 this.$emit。

1.7.野心属性与监视 1.7.1.computed函数 模板中的抒发式天然便捷,但也只可用来作念简单的操作。要是在模板中写太多逻辑,会让模板变得肥壮,难以珍藏。用野心属性来形容依赖反映式气象的复杂逻辑

与Vue2.x中computed建设功能一致

写法

import {computed} from 'vue'​setup(){    ...    //野心属性——简写    let fullName = computed(()=>{        return person.firstName + '-' + person.lastName    })    //野心属性——无缺    let fullName = computed({        get(){            return person.firstName + '-' + person.lastName        },        set(value){            const nameArr = value.split('-')            person.firstName = nameArr[0]            person.lastName = nameArr[1]        }    })}

运行成果

野心属性的第3种写法(访佛举止)

若咱们将通常的函数界说为一个举止而不是野心属性,两种神气在遣散上确乎是全王人换取的,关联词,不同之处在于野心属性值会基于其反映式依赖被缓存。一个野心属性仅会在其反映式依赖更新时才从新野心。

1.7.2.watch函数

与Vue2.x中watch建设功能一致

两个小“坑”:

监视reactive界说的反映式数据时:oldValue无法正确获取、强制开启了深度监视(deep建设失效)。

监视reactive界说的反映式数据中某个属性时:deep建设有用。

//情况一:监视ref界说的反映式数据watch(sum,(newValue,oldValue)=>{    console.log('sum变化了',newValue,oldValue)},{immediate:true})​//情况二:监视多个ref界说的反映式数据watch([sum,msg],(newValue,oldValue)=>{    console.log('sum或msg变化了',newValue,oldValue)}) ​/* 情况三:监视reactive界说的反映式数据            若watch监视的是reactive界说的反映式数据,则无法正确得回oldValue!!            若watch监视的是reactive界说的反映式数据,则强制开启了深度监视 */watch(person,(newValue,oldValue)=>{    console.log('person变化了',newValue,oldValue)},{immediate:true,deep:false}) //此处的deep建设不再会效​//情况四:监视reactive界说的反映式数据中的某个属性watch(()=>person.job,(newValue,oldValue)=>{    console.log('person的job变化了',newValue,oldValue)},{immediate:true,deep:true}) ​//情况五:监视reactive界说的反映式数据中的某些属性watch([()=>person.job,()=>person.name],(newValue,oldValue)=>{    console.log('person的job变化了',newValue,oldValue)},{immediate:true,deep:true})​//罕见情况watch(()=>person.job,(newValue,oldValue)=>{    console.log('person的job变化了',newValue,oldValue)},{deep:true}) //此处由于监视的是reactive素界说的对象中的某个属性,是以deep建设有用
1.7.3.watchEffect函数

watch的套路是:既要指明监视的属性,也要指明监视的回调。

watchEffect的套路是:无谓指明监视哪个属性,监视的回调顶用到哪个属性,那就监视哪个属性。

watchEffect有点像computed:

但computed防卫的野心出来的值(回调函数的复返值),是以必须要写复返值。

而watchEffect更防卫的是进程(回调函数的函数体),是以无谓写复返值。

//watchEffect所指定的回调顶用到的数据唯有发生变化,则平直从新膨胀回调。watchEffect(()=>{    const x1 = sum.value    const x2 = person.age    console.log('watchEffect建设的回调膨胀了')})
1.7.4、相比

四者的区别:

野心属性computed:野心属性只可动作属性用,也能带参数(不提倡用),有缓存,效用高,,不错平直与v-model绑定。

举止:举止不错平直调用,可带参数,莫得缓存,每次调用王人会膨胀,效用不如野心属性高,不可与v-model绑定。

watch:不可显式调用(被监视的对象变化时被迫调用),不错对变化的领域愈加具体,但应用复杂,不错辗转与v-model绑定。

watchEffect:不需要指定监视对象,自动测度出要监视的成员,默许立即监视一次

 

 

 

1.8.toRef

作用:创建一个 ref 对象,其value值指向另一个对象中的某个属性。

语法:const name = toRef(person,'name')

应用: 要将反映式对象中的某个属性单独提供给外部使用时。

平直取出值,口角反映式的:

再次包装天然是反映式的,但已不再是归拢个对象

1.9.toRefs

扩展:toRefs 与toRef功能一致,但不错批量创建多个 ref 对象,语法:toRefs(person)

二、其它 Composition API 2.1.shallowReactive 与 shallowRef

shallowReactive:只处理对象最外层属性的反映式(浅反映式)。

shallowRef:只处理基本数据类型的反映式, 不进行对象的反映式处理。

什么时代使用?

要是有一个对象数据,结构相比深, 但变化时仅仅外层属性变化 ===> shallowReactive。

要是有一个对象数据,后续功能不会修改该对象中的属性,而是生新的对象来替换 ===> shallowRef。

2.2.readonly 与 shallowReadonly

readonly: 让一个反映式数据变为只读的(深只读)。

shallowReadonly:让一个反映式数据变为只读的(浅只读)。

应用场景: 不但愿数据被修改时。

2.3.toRaw 与 markRaw

toRaw:

作用:将一个由reactive生成的反映式对象转为普通对象。

使用场景:用于读取反映式对象对应的普通对象,对这个普通对象的扫数操作,不会引起页面更新。

markRaw:

作用:秀雅一个对象,使其始终不会再成为反映式对象。

应用场景:

有些值不应被设立为反映式的,举例复杂的第三方类库等。

当渲染具有不可变数据源的大列表时,跳过反映式调和不错进步性能。

2.4、限流与防抖 2.4.1、限流(节流)(法规时辰内 只触发一次)

在JS中,要是一个事件时常触发(比如用户恣意点击按钮)况兼处理函数处理耗时还相比长,那么就容易变成性能问题。

限流函数是针对这类问题的优化神气之一,它条款两次事件处理必须大于某个终止时辰,简而言之等于加了一层判断。

限流函数(throttle:节流阀)的中枢在于里面珍藏了一个“前次膨胀时辰点”,通过相比现时膨胀时辰与前次膨胀时辰的差值判断是否“时常”,是否膨胀。限流函数自身是一个遮拦函数,修饰了事件处理器之后复返一个新的闭包函数。经过限流函数处理之后,事件触发的频率就被放弃为事先传入的interval之上了。

莫得限流的一段登录代码,模拟登录:

写一个限流函数惩办限流问题:

衔接点击数十下的成果:

 

节流战术(throttle),领域事件发生的频率,如领域为1s发生一次,以至1分钟发生一次。与处事端(server)及网关(gateway)领域的限流 (Rate Limit) 访佛。

作用: 高频率触发的事件,在指定的单元时辰内,只反映第一次。

节流的应用场景鼠标源源延续地触发某事件(如点击),单元时辰内只触发一次;

监听转动事件,比如是否滑到底部自动加载更多,用throttle来判断。举例:懒加载;

浏览器播放事件,每个一秒野心一次程度信息等

2.4.2、防抖(屡次触发,只膨胀终末一次)

防抖函数亦然一种限流函数,但要罕见一些。最典型的场景是表单输入,要是咱们要在表单中监听input事件(比如汉典搜索),那用户在输入的时代也会时常触发,但这里使用throttle函数不行,因为咱们需要恭候用户罢手输入一段时辰后智商阐述用户输入的值,是以要界说一个新的限流函数,叫作念防抖函数。

防抖(防反跳)函数的中枢是里面使用定时器并珍藏定时器复返的ID值,要是捏续触发则束缚clearTimeout()并从新发起setTimeout(),通过这种神气恭候事件触发罢了,然后进行延时处理。

莫得防抖带来的问题:

 防抖函数:

 

 

防抖战术(debounce)是当事件被触发后,蔓延n秒后再膨胀回调,要是在这n秒内事件又被触发,则从新计时。

作用: 高频率触发的事件,在指定的单元时辰内,只反映终末一次,要是在指定的时辰内再次触发,则从新野心时辰。

防抖的应用场景登录、发短信等按钮幸免用户点击太快,以致于发送了屡次苦求,需要防抖

调和浏览器窗口大小时,resize 次数过于时常,变成野心过多,此时需要一次到位,就用到了防抖

文本裁剪器及时保存,当无任何改换操作一秒后进行保存

2.5.customRef

作用:创建一个自界说的 ref,并对其依赖项追踪和更新触发进行显式领域。

 customRef 接受一个函数作为参数,这个函数接受两个函数作为参数  track (示知vue需要追踪后续本色的变化) 和  trigger (示知vue从新解析模板)。

 

杀青防抖成果:

2.6.provide 与 inject

作用:杀青祖与后代组件间通讯

套路:父组件有一个 provide 选项来提供数据,后代组件有一个 inject 选项来初始使用这些数据

具体写法:

祖组件中:

setup(){    ......    let car = reactive({name:'驰骋',price:'40万'})    provide('car',car)    ......}

后代组件中:

setup(props,context){    ......    const car = inject('car')    return {car}    ......}
2.7.反映式数据的判断

isRef: 查验一个值是否为一个 ref 对象

isReactive: 查验一个对象是否是由 reactive 创建的反映式代理

isReadonly: 查验一个对象是否是由 readonly 创建的只读代理

isProxy: 查验一个对象是否是由 reactive 好像 readonly 举止创建的代理

三、Composition API 的上风 3.1.Options API 存在的问题

使用传统OptionsAPI中,新增好像修改一个需求,就需要区别在data,methods,computed里修改 。

3.2.Composition API 的上风

咱们不错愈加优雅的组织咱们的代码,函数。让关系功能的代码愈加有序的组织在沿途。​

​3.3、折叠代码

折叠代码不错让代码愈加有序,便捷查找与经管

91porn vip