Vue3 Composition API - setup、reactive、ref、readonly、toRefs、toRef

Options API的特点: 对应的属性中编写对应的功能模块(data定义数据,methods定义方法,computed定义计算属性,watch中监听属性改变,还有生命周期的钩子)

一、Options API的弊端

1. 实现某个功能时,这个功能对应的代码逻辑会被拆分到各个属性中

2. 组件变得更大更复杂时逻辑关注点的列表就会增长,同一个功能的逻辑就会被查分的很分散

3. 对于一开始没有编写这些组件的人来说,这个组件的代码是难以阅读和理解的

二、setup函数

1、setup函数的参数

① 第一个参数:props

props 父组件传递过来的属性会被放到props对象中,要在setup中使用,就可以直接通过props获取

② 第二个参数:context(包含三个属性)

· attrs:所有非prop的attribute

· slots:父组件传递过来的插槽

· emit:组件内部需要触发事件时会用到

2、setup函数的返回值

· 可以在template中被使用(通过setup的返回值来替代data选项)

· 返回一个执行函数来替代在methods中定义的方法

3、setup不可以使用this

· this并没有指向当前实例

· 在setup被调用之前,data、computed、methods等都没有被解析

三、Reactive API(为setup中的数据提供响应式的特性)

· 我们使用reactive函数处理我们的数据之后,数据再次被使用时就会进行依赖收集

· 当数据发生改变时,所有收集到的依赖都是进行对应的响应式操作(比如更新界面)

· 我们编写的data选项,也是在内部交给了reactive函数将其编成响应式对象的

       import { reactive } from "vue"

       const state = reactive({

            counter: 10

        })

四、Ref API(为setup中的数据提供响应式的特性)

· ref 会返回一个可变的响应式对象,该对象作为一个响应式的引用维护着它内部的值,这就是ref名称的来源

· 内部的值是在ref的value属性中被维护的

        import { ref } from "vue"

        const counter = ref(10)

五、Readonly API(只读)

· 会返回原生对象的只读代理(也就是proxy,这是一个proxy的set方法被劫持,并且不能对齐进行修改)

     import { readonly } from "vue"

     const info = reactive({

            name: "coco"

        })

        const readonlyInfo = readonly(info)

        const updateState = () => {

            info.name = "jack" // 成功

            readonlyInfo.name = "kiki"  // 失败且警告

        }

六、reactive 相关的API

1.  isProxy

· 检查对象是否由 reactive 或 readonly 创建的 proxy

2.  isReactive

· 检查对象是否由 reactive 创建的响应式代理

· 如果该代理是 readonly 创建的,但包裹了由 reactive 创建的另一个代理,它也会返回true

3.  isReadonly

· 检查对象是否由 readonly 创建的只读代理

4.  toRaw

· 返回由reactive 或 readonly代理的原始对象(不建议保留对原始对象的持久引用)

5.  shallowReactive

· 创建一个响应式代理,他跟踪其自身 property 的响应式,但不执行嵌套对象的深层响应式转换(深层还是原生对象)

6.  shallowReadonly

· 创建一个 proxy,使其自身 property 为只读,但不执行嵌套对象的深度只读转换(深层还是可读、可写的)

七、toRefs

· 可以将 reactive 返回的对象中的属性都转成 ref

· 这种做法相当于在state.name 和 ref.value之间建立了链接任何一个修改都会引起另一个的变化

八、toRef

· 将 reactive 中的某一个属性都转成 ref

九、ref 相关的API

1.  isRef

· 判断是否是一个 ref 对象

2.  unref

· 如果参数是一个ref,则返回内部值,否则返回参数本身

· 这是 val = isRef(val) ? val.value : val 的语法糖函数

3.  shallowRef

· 创建一个渐层的 ref 对象

4.  triggerRef

· 手动触发和 shallowRef 相关联的副作用

4.  customRef

· 创建一个自定义ref,并对其依赖项跟踪和更新触发进行显示控制

· 它需要一个工厂函数,该函数接受track和trigger函数座位参数

· 返回一个带有get和set的对象

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容