Vue3中Composition的API用法详解

 更新时间:2023年06月16日 08:45:48   作者:会说法语的猪  
这篇文章主要为大家详细介绍了Vue3中Composition的一些常见API的用法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

一、 Reactive判断的API 

1. isProxy

检查对象是否由reactive或者readonly创建的proxy ,返回一个布尔值

<script setup>
import { reactive, readonly, isProxy } from 'vue'
let foo = readonly({ name: 'WFT1' }) // 其中的属性不可修改
let bar = reactive({ name: 'WFT2' })
console.log(isProxy(foo)) // true
console.log(isProxy(bar)) // true
</script>

2. isReactive

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

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

<script setup>
import { reactive, readonly, isReactive } from 'vue'
let foo = reactive({ name: 'WFT2' })
let bar = readonly(reactive({ name: 'WFT1' }))
let info = readonly({ age: 18 })
console.log(isReactive(foo)) // true
console.log(isReactive(bar)) // true
console.log(isReactive(info)) // false
</script>

3.  isReadonly

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

<script setup>
import { readonly, isReadonly } from 'vue'
let foo = readonly({ name: 'WFT1' })
console.log(isReadonly(foo)) // true
</script>

4. toRaw

返回 reactive 或 readonly代理的原始对象(不建议保留对原始对象的持久引用,请谨慎使用) 

<script setup>
import { reactive, readonly, toRaw } from 'vue'
let obj1 = { name: 'WFT1' }
let obj2 = { name: 'WFT2' }
let foo = reactive(obj1)
let bar = readonly(obj2)
let myObj1 = toRaw(foo)
let myObj2 = toRaw(bar)
console.log(myObj1 === obj1) // true
console.log(myObj2 === obj2) // true
</script>

5. shallowReactive

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

<template>
  <div class="main">
    <h3>{{ obj.info.name }}</h3>
    <button @click="edit">深层修改</button>
  </div>
</template>
<script setup>
import { shallowReactive } from 'vue'
let obj = shallowReactive({
  info: {
    name: 'WFT'
  }
})
const edit = () => {
  obj.info.name = '哈哈哈'
  console.log(obj)
}
</script>

上面代码,当点击深层修改按钮时 页面并没有改变,但是控制台打印的obj其中的info.name已经修改。如果换成reactive包裹就会发生改变 

6. shallowReadonly

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

<script setup>
import { readonly } from 'vue'
let obj = readonly({
  info: {
    name: 'WFT'
  }
})
const edit = () => {
  obj.info.name = '哈哈哈'
}
</script>

看这段儿代码,我们去修改其中属性在控制台会给出警告,为一个只读属性,不可修改

但是将readonly换成 shallowReadonly 就可以修改了,当然浅层是不能修改的,深层还是可以修改

<script setup>
import { shallowReadonly } from 'vue'
let obj = shallowReadonly({
  info: {
    name: 'WFT'
  }
})
const edit = () => {
  obj.info.name = '哈哈哈'
}
</script>

二、Ref相关的API 

1.isRef 

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

<script setup>
import { ref, isRef } from 'vue'
const name = ref('WFT')
console.log(isRef(name)) // true
</script>

2. toRefs 

这个就是,当我们使用了reactive定义了响应式对象的时候,我们想通过es6语法解构出来使用的华,这时候的解构出来的就不是响应式数据。如果想解构出来的也是响应式数据,就要使用toRefs了,使用toRefs包裹之后,再解构出来,里面的每个属性都相当于通过ref包裹了一层的

<template>
  <div class="main">
    <h3>{{ info.age }}</h3>
    <h3>{{ age }}</h3>
    <button @click="edit">修改age</button>
  </div>
</template>
<script setup>
import { reactive, toRefs } from 'vue'
let info = reactive({ age: 18 })
let { age } = toRefs(info)
const edit = () => {
  age.value++
}
</script>

就像上面的代码示例 

3. toRef

这个和toRefs有着一样的功能,只不过这个是将里面的某一个属性转为响应式,该方法接受两个参数,第一个参数就是目标reactive对象,第二个就是我们要操作的属性 

<template>
  <div class="main">
    <h3>{{ info.age }}</h3>
    <h3>{{ age }}</h3>
    <button @click="edit">修改age</button>
  </div>
</template>
<script setup>
import { reactive, toRef } from 'vue'
let info = reactive({ name: 'wft', age: 18 })
let age = toRef(info, 'age')
const edit = () => {
  age.value++
}
</script>
<script setup>
import { reactive, toRef } from 'vue'
const state = reactive({ name: 'wft', age: 18 })
// 如果我们只希望转换一个reactive对象中的属性为ref响应式变量,那么可以使用toRef方法
const name = toRef(state, 'name')
const { age } = state // 这个age不是响应式数据
const changeName = () => state.name = 'WFT'
</script>

4. unref

如果我们想要获取一个ref引用中的value,那么也可以通过unref

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

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

<script setup>
import { ref, unref } from 'vue'
const name = ref('WFT')
test(name)
test('这个名字不是由ref方法包裹的')
function test(name) {
  console.log(unref(name))
}
</script>

5. shallowRef

创建一个浅层的ref对象 和 shallowReactive类似

<template>
  <div class="main">
    <h3>{{ obj.info.age }}</h3>
    <button @click="editAge">修改age</button>
  </div>
</template>
<script setup>
import { shallowRef } from 'vue'
const obj = shallowRef({ info: { name: 'wft', age: 18 } })
const editAge = () => {
  obj.value.info.age++
  console.log(obj.value.info.age) // 19  但是页面没有更新
}
</script>

6. triggerRef

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

还是上面的代码,我们使用shallowRef包裹的浅层ref对象,修改深层变量的时候页面不会进行更新,这时候我们手动调用triggerRef就可以强制更新 

<template>
  <div class="main">
    <h3>{{ obj.info.age }}</h3>
    <button @click="editAge">修改age</button>
  </div>
</template>
<script setup>
import { shallowRef, triggerRef } from 'vue'
const obj = shallowRef({ info: { name: 'wft', age: 18 } })
const editAge = () => {
  obj.value.info.age++
  triggerRef(obj)
}
</script>

7. customRef (使用极少)

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

它需要一个工厂函数 ,该函数接受 track 和 trigger函数作为参数;

并且应该返回一个带有get 和 set的对象 

其实上面真正使用到的时候就不多,这个的使用就更少了,所以我也没有很深入去研究这个api,所以这个不做案例代码了,知道有这个东西就好了,大家感兴趣可以自己去百度找一些案例看看,一般做第三方库的时候可能会使用这个api 

以上就是Vue3中Composition的API用法详解的详细内容,更多关于Vue3 Composition API的资料请关注脚本之家其它相关文章!

相关文章

  • vue使用原生js实现滚动页面跟踪导航高亮的示例代码

    vue使用原生js实现滚动页面跟踪导航高亮的示例代码

    这篇文章主要介绍了vue使用原生js实现滚动页面跟踪导航高亮的示例代码,滚动页面指定区域导航高亮。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • 详解vue-cli 脚手架 安装

    详解vue-cli 脚手架 安装

    这篇文章主要介绍了vue-cli脚手架安装,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • 前端框架Vue父子组件数据双向绑定的实现

    前端框架Vue父子组件数据双向绑定的实现

    Vue项目中经常使用到组件之间的数值传递,实现的方法很多,但是原理上基本大同小异。这篇文章将给大家介绍Vue 父子组件数据单向绑定与Vue 父子组件数据双向绑定的对比从而认识双向绑定
    2021-09-09
  • vue 设置 input 为不可以编辑的实现方法

    vue 设置 input 为不可以编辑的实现方法

    今天小编就为大家分享一篇vue 设置 input 为不可以编辑的实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-09-09
  • Vue如何整合mavon-editor编辑器(markdown编辑和预览)

    Vue如何整合mavon-editor编辑器(markdown编辑和预览)

    这篇文章主要介绍了Vue整合mavon-editor编辑器(markdown编辑和预览)的相关知识,mavon-editor是目前比较主流的markdown编辑器,重点介绍它的使用方法,需要的朋友可以参考下
    2022-10-10
  • vue js秒转天数小时分钟秒的实例代码

    vue js秒转天数小时分钟秒的实例代码

    这篇文章主要介绍了vue js秒转天数小时分钟秒的实例代码,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-08-08
  • 详解webpack+vue-cli项目打包技巧

    详解webpack+vue-cli项目打包技巧

    本篇文章主要介绍了详解webpack+vue-cli项目打包技巧 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • VUE-cli3使用 svg-sprite-loader

    VUE-cli3使用 svg-sprite-loader

    svg-sprite-loader 的插件,用来根据导入的 svg 文件自动生成 symbol 标签并插入 html,这篇文章主要介绍了VUE-cli3使用 svg-sprite-loader,需要的朋友可以参考下
    2018-10-10
  • Vue中的event对象介绍

    Vue中的event对象介绍

    这篇文章介绍了Vue中的event对象,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • vue中实现移动端的scroll滚动方法

    vue中实现移动端的scroll滚动方法

    下面小编就为大家分享一篇vue中实现移动端的scroll滚动方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03

最新评论