vue3的reactive和ref及两者之间的简单对比

557 阅读3分钟

一、前言

大家好,我是地霊殿__三無,兜兜转转,总算略有空闲,可以静下来学习学习vue3的相关知识了,在学习之余记录一下,加深印象。

二、reactive

1、介绍

reactive可以用来包装一个对象,使其每个对象属性都具有响应性(也就是深层次响应式)。

2、特性

reactive内部是基于es6的proxy实现的,它接收一个对象(object)或者数组(arr),返回一个proxy代理对象,通过这个对象操作源对象内部数据做出改变。

需要注意的是,基本类型数据就不用reactive了,虽然也可以使用,但会报警告。

3、用法

在引入reactive后,用法上也就是定义的时候,跟我们以往定义定量有所不同,需要用reactive来定义对象或者数组,其余地方就可以像vue2那样,直接读取属性。

import { reactive } from 'vue'
const job = reactive({
  name: '股市',
  str: '做梦'
})
const arr = reactive([
  1, 2, 3, 4, 5
])

在页面里使用

<div class="title" @click="funReact">
    {{ job.name }}--{{ job.str }}-{{arr[2}}
</div>

在函数里调用

  function funReact () {
      arr = [6, 7, 8, 9, 10]
      console.log(job.name)
      console.log(job.str)
      console.log(arr[2])
      job.str = '做春秋大梦'
    }

默认情况下,修改对象无法实现界面的数据绑定更新,所以上面函数对arr直接进行修改,在数据层面是修改了,但是并不会响应到页面上进行改变。 如果需要更新,需要进行重新赋值,像上述的job.str一样。(即不允许直接操作数据,需要放个新的数据来替代原数据)

三、ref

1、介绍

ref和reactive一样,也是用来实现响应式数据的方法,用于基础数据实现响应式。主要是提供一个简便版的reactive

2、特性

ref底层其实还是reactive,所以当运行时系统会自动根据传入的ref转换成reactive.

3、用法

ref支持字符串,数字,布尔值

import { ref } from 'vue'
const bool = ref(false)
const num = ref(233)
const str = ref('奥特曼')

在页面里使用,用法基本相同

<div @click="funRef">
      {{ bool }}-{{ num }}-{{ str }}
</div>

在函数里调用,跟reactive不同的是,必须添加.value后缀,才能访问到,不然只能得到一个proxy对象。

function funRef () {
  bool.value = true
  num.value = 666
  str.value = '小怪兽'
  console.log(bool.value, num, str.value)
}

红框就是num,我们不用value,得到的就是它的proxy对象。 image.png

4、ref获取元素

this.$refs在vue3中已经消失了,所以我们得用ref来获取对应的dom元素

第一步,准备一个dom元素,我们定义ref的值为box

<div ref="box" @click="funRef">
    {{ bool }}-{{ num }}-{{ str }}
  </div>

第二步,生成一个同名变量,然后获取dom

这里分两种写法,

第一个是setup函数

在setup函数下的最外层,声明box变量,然后需要调用onMounted函数,才能在挂载之后获取到dom元素,这里的box.value就是dom元素了。

import { ref, onMounted } from 'vue'
setup() {
   const box = ref(null) 
   onMounted(() => {
     console.log(box.value)
   })
   return {box}
}

第二个是setup标签

在setup标签里,也是最外层,声明box变量,可以直接在函数里使用。

import { ref } from 'vue'
const box = ref(null)
function funRef () {
  console.log(box.value)
}

image.png

四、ref和reactive对比

1、定义数据层面

ref适用于,基本类型(字符串,数字,布尔值)

reactive适用于复杂类型(对象,数组)

2、原理实现层面

ref是通过Object.defineProperty()的get与set,实现的数据劫持响应式

reactive则是通过proxy来实现数据劫持响应式的,并通过代理对象操作源对象内部数据。

3、实际写法层面

ref定义的数据,js中访问 需要添加.value, html不用

reactive定义的数据,js、html访问均不用添加.value

五、总结

reactive和ref各有用途,大家可以根据它们的特性,在合适的应用场景利用起它们。

ps: 我是地霊殿__三無,浅浅记录。

Snipaste_2022-07-19_15-30-26.jpg