初识setup,ref,reactive 函数及Vue3.0响应式原理

225 阅读2分钟

1.什么是setup:

1.它是Vue3.0中一个新的配置项,值是一个函数。
2.它是所有Composition API 的“表演舞台”。
3.组件中用到的:数据,方法等均要配置在setuo中
4.setup函数的两种返回值:
    1.返回一个对象,对象中的方法与属性可以直接在模板中使用
    2.返回一个渲染函数:可以自定义渲染内热(了解)

2.ref函数:

   1.作用:定义一个响应式的数据
   2.语法:const xxx = ref(initValue)
   3.接收的数据可以是:基本类型,也可以是对象类型。
       基本类型数据:响应式依然是靠object.defineProperty()的getset完成的
       对象类型的数据:内部需要 “求助” 了Vue3.0中的一个新函数————reactive函数
       

3.reactive函数:

    1.作用:定义一个对象类型的响应式的数据 (基本类别数据用ref函数)
    2.语法:const 代理对象 = ref(被代理对象) 接受一个对象或数组,返回一个代理对象 proxy
    3.reactive函数定义的响应式数据是 “深层次的”
    4.内部基于ES6的Proxy实现的,通过代理对象操作对象内的数据都是响应式的

4.ref对比reactive:

    1.从定义数据角度:
        ref用来定义:基本数据类型
        reactive用来定义:对象或者数组 类型数据
        ref也可以用来定义对象或者数组类型数据但是它内部还是通过请求reactive的帮助来实现
    2.从原理角度对比:
        ref通过object.defineProperty()的getset来实现的响应式(数据劫持)
        reactive通过使用Proxy来实现响应式(数据劫持),通过RefIect操作源对象内部数据
    3.从使用角度对比:
        ref定义数据:操作数据需要.value,读取数据时模板中直接读取不需要value
        reactive定义的数据:操作数据与读取数据都不需要.value

5.Vue3.0的响应式原理:

    vue2.0响应式存在的问题:新增属性,删除属性,界面不会更新 直接通过下标修改数组,界面不会自动更新
    实现原理:
        通过Proxy(代理):拦截对象人员属性的变化包括:属性值的读写,属性的添加,属性的删除等
        通过RefIect(反射): 对被代理的属性对象进行操作
new Proxy(data,{
    //拦截读取属性值
    get (target,prop){
        return Reflect.get(target,prop)
    },
    //拦截设置属性值或者添加新的属性
    set (target,prop,value) {
        return Reflect,set(target,prop,value)
    },
    //拦截删除属性
    defineProperty (target,prop) {
        return Reflect.defineProperty(target,prop)
    }
})