v3学习

92 阅读3分钟

 vue3

vue3带来了什么?

  1.性能的提升

          打包大小减少41%

          初次渲染快55%,更新渲染快133%

          内存减少54%

  2.源码的升级

          使用proxy代替definProperty实现响应式

          重写虚拟DOM的实现和Tree-Shaing

 3.拥抱TypeScript

     vue3更好的支持TypeScript

 4.新特性

1.Composition API

              setup配置

                    ref与reactive

                    watch与watchEffect

                    provide与inject

2.新的内置组件

                    Fragment

                    Teleport

                    Suspense

         3 其他改变

                     新的生命周期钩子

                     data选项应始终被声明为一个函数

                     移除keyCode支持v-on的修饰符

什么是vite?

    新一代前端构建工具

    优势如下:

           开发环境中,无需打包操作,可快速的冷启动

           轻量快速的热重量(HMR)

           真正的按需编译,不在等待整个应用编译完成

ref函数?

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

      语法:const xxx = ref(initvalue)

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

                JS中操作数据:xxx.value

        模板中读取数据:不需要.value,直接:

{{xxx}}

   备注:接收数据可以是基本类型 也可以是对象类型

                基本类型 响应式依然靠Object.defineProperty()的get和set

                对象类型 内部求助了reactive函数

reactive函数

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

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

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

      内部基于es6的proxy实现,通过代理对象操作源对象内部数据都是响应式的

vue3响应式原理

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

        通过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)

        }

      //此示例有MDN提供

    })

reactive与ref的区别

    1.从定义角度对比:

            ref用来定义基本类型数据

            reactive用来定义对象或数组类型数据

            ref也可以定义对象或数组类型数据,它内部会通过reactive转为代理对象

    2.从原理角度对比:

            ref是通过Object.defineProperty的get和set方法来实现响应式

            reactive通过Proxy来实现响应式,并通过Reflect操作源对象内部数据

3.从使用场景对比:

            ref操作数据需要.value,读取数据时模板中可直接读取不需要,value 

            reactive操作数据与读取数据都不需要.value

setup的两个注意点

   1.setup执行的时机

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

    2.setup的参数

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

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

               context:上下文对象

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

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

vue3 computed的两种写法

1.只读写法:

            let xx = computed(()=>{}}

   2.可修改写法(完整写法)

             let xx = computed({

             get(){}

             set(){}

           })

vue3 watch的写法

           let arr = ref('12')

           let res = ref('1')

           let data = reactive({

                num:1,

                                str:'1'

                                list:{

                   a:1        

                }

            })

     监听ref所定义的响应式数据时不用.value

1.监听ref定义的一个响应式数据

                watch(arr,(newValue,oldValue)=>{},{immediate:true})

                immediate立即执行