Vue3开发(四)之响应式代码

53 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第4天,点击查看活动详情

前言

Vue3响应式数据是如何实现的,又有那些需要我们注意的方面呢?Vue3通过ref与reactive定义响应式数据,我们一起来了解下吧!

一、ref函数

ref定义一个响应式的数据,加工的数据会变成一个对象,是RefImpl的对象,在js操作中改变一个变量的值需要.value,但在模板中引用的时候不需要加.value,如果加工的数据是一个对象,那ref会把对象转成代理对象(proxy)。

<template>
  <h1>姓名:{{name}}</h1>
  <h1>职位:{{job.name}}</h1>
  <button @click="changeInfo">修改信息</button>
</template>

<script>
import { ref } from 'vue'
export default {
  name: 'App',
  setup() {
    // 数据
    let name = ref('张三')
    let job = ref({
      type: '研发',
      name: '前端工程师'
    })
    // 方法
    function changeInfo() {
      name.value = '李四'
      job.value.name = '后端工程师'
    }
    return {
      name,
      job,
      changeInfo
    }
  }
}
</script>

二、reactive函数

reactive定义一个对象类型的响应式数据(基本类型用ref),返回一个代理对象(Proxy的实例对象),是深层次的,内部基于ES6的Proxy实现,通过代理对象操作源对象内部数据进行操作。

<template>
  <h1>姓名:{{person.name}}</h1>
  <h1>职位:{{person.job.name}}</h1>
  <h1>爱好:{{person.hobby[0]}}</h1>
  <button @click="changeInfo">修改信息</button>
</template>
<script>
import { reactive } from 'vue'
export default {
  name: 'App',
  setup() {
    // 数据
    let person = reactive({
      name: '张三',
      job: {
        type: '研发',
        name: '前端工程师'
      },
      hobby: ['抽烟', '喝酒', '烫头']
    })
    // 方法
    function changeInfo() {
       person.name = '李四'
       person.job.name = '后端工程师'
       person.hobby[0] = '学习'
    }
    return {
      person,
      changeInfo
    }
  }
}
</script>

三、reactive与ref对比

  • 定义数据角度
    • ref通常用来定义基本类型数据(也可以用来定义对象(或数组)类型的数据,但是他的内部会自动通过reactive转成代理对象,那还不如直接使用reactive呢)
    • reactive用来定义对象(或数组)类型数据
  • 原理角度
    • ref通过Object.defineProparty()的get和set实现响应式
    • reactive是通过使用Proxy来实现响应式,并通过Reflect操作源对象内部的数据
  • 使用角度
    • ref定义的数据在操作的时候需要用.value,读取的时候不需要.value
    • reactive定义的数据操作和读取时都不需要.value

结束语

这一章我们学习了Vue3响应式代码,但是响应式原理是什么呢,下一章让我们一起了解下响应式原理吧!