vue3学习笔记

2.ref函数:

作用:定义一个响应式的数据

语法:const xxx=ref(initValue)

创建一个包含响应式数据的引用对象(reference对象,简称ref对象)

js种操作数据 :xxx.value

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

备注:

接受的数据可以是:基本类型,也可以是对象类型

基本类型的数据:响应式依然是靠 get和set完成的

对象类型的数据:内部求助了Vue3.0中的一个新函数,——reactive函数

3.reactive函数

作用:定义一个对象类型的响应式数据(基本类型别用它,用ref函数)

语法:const 代理对象=reactive(被代理对象)接受一个对象(或者是数组),返回一个代理对象( proxy对象)

reactive定义的响应式数据是”深层次“的

内部基于 ES6的Proxy实现,通过代理对象操作源对象内部数据进行操作

4.Vue3.0中的响应式原理

vue2.0x的响应式

实现原理:

对象类型:通过Object.defineProperty()对对象的已有属性值的读取,修改进行拦截(数据劫持)

数组类型:通过重写更新数组的一系列方法来实现拦截。(对数组的变更方法进行了包裹)

Object.defineProperty(data,'count',{get() {},set() {},})

存在问题:

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

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

Vue3.0x的响应式

实现原理

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

通过Reflect(反射):被代理对象的属性进行操作

MDN文档当中的Proxy 和 Reflect:

        Proxy:

        Reflect:

new Proxy(data,{

get(target,prop){

return Reflect.get(target,prop)

},

//拦截设置属性值或者是添加新属性

set(target,prop,value){

return Reflect.set(target,prop,value)

}

})

target对象里面是没有propName属性的,所以用 .  的方式是找不到变量名字是propName的属性的

对象属性的读取必须必须使用 [] 

propName是一个字符串,你见过obj.'name'  这么操作的么

5.reactive对比ref

从定义数据角度对比

ref用来定义:基本数据类型

rective用来定义:对象(或者是数组)类型数据

备注:ref也可以来定义对象(或者数组)类型数据,它内部会自动通过reactive转换为代理对象

从原理角度对比:

ref通过Object.defineProperty() 的 get 和 set 来实现响应式(数据劫持)

reactive通过使用Prxoy来实现响应式(数据劫持),并且通过Reflect操作源对象内部的数据

从使用角度对比

ref定义的数据:操作数据需要 .value ,读取数据的时候模板中直接读取,不需要 .value

reactive定义的数据:操作数据和读取数据都不需要 .value

6.setup的两个注意点儿

setup执行的实际

在beforeCreate之前执行一次,this是undefined

setup的参数

        props:值是对象,包含:组件外部传递过来,并且组件内部声明接收了的属性

        context:上下文对象

attrs:值是对象,包含:组件外部传递过来,但是没有在props配置中声明的属性,相当于 this.$attrs

slots:收到的插槽内容,相当于  this.$slots。

emit:分发自定义事件的函数,相当于 this.$emit

7.计算属性和监视

1.computed函数

和vue2.0x中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]

}

})

}

2.watch函数

和vue2.0x中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变了',newValue,oldValue);

},{immediate:true,deep:true})

/*情况三:监视reactive所定义的一个响应式数据的全部属性

1.注意:此处无法正确的获取oldValue,

2.强制开启了深度监视(也就是deep配置无效)

**/

watch(person,(newValue,oldValue)=>{

    console.log('person变化了',newValue,oldValue);

},{deep:false})//此时的deep配置无效

//情况四:监视reactive所定义的一个响应式数据中的某个属性.需要写成一个函数,让人家帮你调用

watch(()=>person.age,(newValue,oldValue)=>{

    console.log('person的age变化了',newValue,oldValue);

},{deep:false})

//情况五:监视reactive所定义的一个响应式数据中的某些属性

watch([()=>person.name,()=>person.age],(newValue,oldValue)=>{

    console.log('person的name或者是age变化了',newValue,oldValue);

})

//特殊情况

watch(()=>person.job,(newValue,oldValue)=>{

    console.log('person里面的job变化了',newValue,oldValue)  ;

},{deep:true})//此处由于监视的是reactive中定义的对象的某个属性,所以,deep配置有效

也就是说,如果你监视的如果是个对象,手动自动开始深度监视都无效,如果监视的是对象里面的基本数据类型,默认开启的深度监视有效,第三种要监视对象内的对象要手动开启深度监视

3.watch函数

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

watchEffect的套路是:不用知名监视哪个属性,监视的会调用中用到哪个属性,那就监视哪个属性

watchEffect有点儿像computed

但是computed注重的计算出来的值 (回调函数的返回值),所以必须要些返回值

但是watchEfferc更注重的是过程(回调函数的函数体),所以不用写返回值

//watchEffect所指定的回调中用到的数据只要发生变化,就直接重新执行回调

watchEffect(()=>{

const x1=sum.value

const x2=person.age

console.log('watchEffect配置的回调执行了')

})

8.生命周期

vue3.0中可以继续使用vue2.0中的生命周期钩子,但是有两个已经被改名

  beforeDestory改名为beforeUnmount

destoryed改名为unmounted

vue3.0也提供了Composition API形式的生命周期钩子,和vue2.0x中钩子的对应关系如下

beforeCreate => setup()

created        => setup()

beforeMount =>onBeforeMount

mounted      =>onMounted

beforeUpdate  =>onBeforeUpdate

updated        =>onUpdated

beforeUnmount =>onBeforeUnmount

unmounted      =>onUnmounted

9.自定义hook函数

什么是hook?——本质是要给函数,把setup函数中使用的CompoistionApi进行了封装

类似于vue2.0x中的mixin

自定义Hook的优势:复用代码,让setup中的逻辑更清楚易懂

10.toRef

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

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

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

扩展:toRefs 和 toRef功能一致,但是可以批量创建多个ref对象,语法: toRefs(person)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容