返回

Vue3 源码解析:响应式数据 Reactive

前端

Vue3 中的响应式数据

在 Vue3 中,响应式数据是指能够自动追踪和更新依赖于它的组件的数据。当响应式数据发生变化时,Vue3 会自动更新所有依赖于它的组件。这使得 Vue3 能够高效地更新 UI,并减少不必要的渲染。

Reactive

Reactive 是 Vue3 中将引用数据类型变为响应式数据最常用的方法。它可以将对象或数组变为响应式数据。当响应式对象或数组中的属性发生变化时,Vue3 会自动更新所有依赖于它的组件。

const person = reactive({
  name: 'John',
  age: 30
})

person.name = 'Mary' // Vue3 会自动更新依赖于 person.name 的组件

shallowReactive

shallowReactive 与 Reactive 类似,但它只对对象或数组的第一层属性进行响应式处理。这意味着,如果对象或数组中的属性是一个对象或数组,那么该属性不会被响应式处理。

const person = shallowReactive({
  name: 'John',
  address: {
    street: '123 Main Street',
    city: 'Anytown'
  }
})

person.name = 'Mary' // Vue3 会自动更新依赖于 person.name 的组件
person.address.street = '456 Elm Street' // Vue3 不会更新依赖于 person.address.street 的组件

readonly

readonly 可以将对象或数组变为只读响应式数据。这意味着,对象或数组中的属性不能被修改。如果尝试修改只读响应式数据中的属性,Vue3 会抛出一个错误。

const person = readonly({
  name: 'John',
  age: 30
})

person.name = 'Mary' // Vue3 会抛出一个错误

deepReactive

deepReactive 可以将对象或数组及其所有嵌套属性变为响应式数据。这意味着,无论对象或数组中的属性是对象、数组还是基本类型,它们都会被响应式处理。

const person = deepReactive({
  name: 'John',
  address: {
    street: '123 Main Street',
    city: 'Anytown'
  }
})

person.name = 'Mary' // Vue3 会自动更新依赖于 person.name 的组件
person.address.street = '456 Elm Street' // Vue3 会自动更新依赖于 person.address.street 的组件

结语

在 Vue3 中,响应式数据是实现高效 UI 更新的关键。Reactive、shallowReactive、readonly 和 deepReactive 是 Vue3 中将引用数据类型变为响应式数据最常用的方法。每种方法都有其独特的用途,开发人员可以根据具体情况选择合适的方法。