暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

vue3.0 中的 ref 和 reactive 小结

前端怪咖 2022-06-06
681

在vue3.0中,声明一个变量最常使用的就是ref  和 reactive 两种类型。这篇来总结一下两者的相同点和不同点。

一、ref

创建一个响应式的变量,主要是一些 基本数据类型,可以直接返回创建的值。

因为ref( ) 创建的是一个对象,所以在js中读取使用 .value 形式获取, 但在 template模板中可以直接读取,自动展开渲染内部的值。

<template>
{{test}}
</template>

<script lang="ts">
import { defineComponent, ref } from 'vue';
   
export default defineComponent ({
   setup () {
       const test = ref('hello')
       
       console.log(test.value) // hello
       
       return {test}
  }
})

</script>

二、reactive

创建一个响应式的对象,主要是 object 和 array 类型。

它与ref创建的变量有几点不同:

  1. 在template模板中,需要用 x.y 的形式获取值;

  2. 在js中,不需要.value,可以 直接修改

  3. 可以直接返回创建的值,以链式调用读取,也可以直接读取变量里的值(需要用到 toRefs )

<template>
{{test.name}}
{{test.message}}
</template>

<script lang="ts">
import { defineComponent, reactive } from 'vue';
   
export default defineComponent ({
   setup () {
       const test = reactive({
           name: 'hello',
           message: 'world'
      })
       
       console.log(test.name) // hello
       
       return {test}
  }
})

</script>

三、toRefs

当遇到一些 reactive 创建的对象比较多的时候,我们又不想在template中使用链式调用。这个时候可以使用 toRefs, 结合扩展运算符 ...
 可以很方面的将他们暴露出来。

它的作用是将reactive 创建的变量,转化为普通的响应式变量。

<template>
{{name}} hello
{{message}} wolrd
</template>

<script lang="ts">
import { defineComponent, reactive, toRefs } from 'vue';
   
export default defineComponent ({
   setup () {
       const test = reactive({
           name: 'hello',
           message: 'world'
      })
       const testRef = toRefs(test)
     
       return {
           ...testRef
      }
  }
})

</script>

四、isRef

最后补充一个isRef ,用于判断当前这个变量是不是通过 ref ( ) 创建出来的。

<script lang="ts">
import { defineComponent, isRef } from 'vue';
   
export default defineComponent ({
   setup () {
       const test1: string = 'hello'
       const test2 = ref<string>('world')
       const test3 = reactive({
           age: 18
      })
       
       console.log(isRef(test1))  // false
       console.log(isRef(test2)) // true
       console.log(isRef(test3)) // false
       
       return {
           test1,
           test2,
           test3
      }
     
  }
})

</script>


文章转载自前端怪咖,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论