从0开始vue3(三) | ref和reactive

765 阅读2分钟

「这是我参与2022首次更文挑战的第6天,活动详情查看:2022首次更文挑战」。

vue3慢慢学系列!🙉

前言

在 vue2.x 中, 定义数据都是在data中,但是在Vue3中,我们可以在setup 里面直接定义。比如:

<template>
  <div>{{num}}</div>
</template>

<script setup>
  let num = 0;
</script>

但是这个时候会有个问题,这个num是非响应式的。即num动态改变之后,界面上还是一直显示的初始值0。可以做一个简单的测试

image-20220131203308448

🎨 效果:

可以看到,当num值改变时,视图并没有跟着更新。

ref

在 Vue 3.0 中,为了解决这个问题,我们可以通过使用 ref 函数来处理。

<template>
  <button @click="count">按钮</button>
  <div>num值显示为:{{num}}</div>
</template>

<script setup>
  import { ref } from 'vue'  
  let num = ref(0)   
  function count() {
    num.value++
    console.log('当前结果',num.value)
  }
</script

使用之后的效果:

💥 注意:

上面的示例中我们可以看到

  • 值被ref包裹之后,我们改变num,使用的是num.value

这是因为,ref 接收参数并将其包裹在一个带有 value property 的对象中返回,然后使用该 property 访问或更改响应式变量的值。

💡 扩展:

我们上面通过ref为基础类型的数据创建了响应式,那么如果是一个对象或者数组呢?ref同样适用,可以通过示例来看下

image-20220131215651536

🎨 结果展示:

(等待几秒)

结果对比:

image-20220131220018323

reactive

虽然不论是基础类型string,number,还是复杂引用类型array,object都可以用ref来定义,但是定义对象的话,通常会使用reactive来实现。

image-20220131220725540

ref与reactive的区别与联系

  • 一般来说,ref用来定义简单的字符串或者数值,而reactive用来定义对象数组等。

  • ref定义数据时,会对里面的数据类型进行一层判断,当遇到复杂的引用类型时, 还是会使用reactive来处理。

  • 可以用ref定义对象数组等,但是如果用reactive来定义基本类型会被警告。

image-20220131221203422

参考资料:

Vue ref

Vue reactive


🎨【点赞】【关注】不迷路,更多前端干货等你解锁

往期推荐

👉 JavaScript的Proxy代理怎么用?

👉 JS中的getter和setter你会用吗?

👉 深入理解ES6箭头对象

👉 JS的装饰器模式实例分析