JS:ReactiveObject-响应式对象

定义

“响应式对象”(Reactive Object) 是现代前端框架(如 Vue 3、React 的某些状态管理库)中的核心概念。

响应式对象是一个“能自动通知视图更新”的 JavaScript 对象。当你修改它的属性时,使用该属性的地方(比如页面模板)会自动重新渲染。

普通对象 vs 响应式对象

普通对象(Non-Reactive)

const user = { name: "张三" }

// 修改名字
user.name = "李四"

// 但页面不会自动更新!
// 你需要手动调用 render() 或 setState() 才能刷新 UI

数据变了,UI 不知道。你需要手动触发更新(比如 React 的 setState)。

响应式对象(Reactive)

import { reactive } from 'vue'

const user = reactive({ name: "张三" })

// 修改名字
user.name = "李四"

// ✅ 页面中所有用到 user.name 的地方自动更新!

数据变了,系统自动知道,并更新相关 UI。无需手动操作,一切自动完成。

响应式对象的核心能力

能力 说明
1. 依赖追踪(Track) 当你读取 user.name 时,系统记录:“当前组件/计算属性依赖了这个值”
2. 变更通知(Trigger) 当你修改 user.name = "李四",系统立刻通知所有依赖者:“数据变了,请更新!”
3. 自动更新(Update) 组件、计算属性、模板等自动重新执行或渲染

在 Vue 3 中如何创建响应式对象?

reactive(obj)将普通对象转为响应式

import { reactive } from 'vue'

const state = reactive({
  count: 0,
  user: {
    name: 'Alice'
  }
})

state.count++ // 页面中 {{ state.count }} 自动变成 1

ref(value)创建响应式“引用”(适合原始值)

import { ref } from 'vue'

const count = ref(0)
count.value++ // 注意:要通过 .value 访问

reactive 适合对象/数组,ref 适合数字、字符串等原始类型。

响应式对象的底层原理(简化版)

// 伪代码示意
function reactive(obj) {
  return new Proxy(obj, {
    get(target, key) {
      track(target, key) // 依赖追踪
      return target[key]
    },
    set(target, key, value) {
      target[key] = value
      trigger(target, key) // 触发更新
    }
  })
}

Vue 3 使用 Proxy(代理) 实现响应式:

  • get 拦截读取 → 记录谁在用这个数据(依赖收集)
  • set 拦截赋值 → 通知所有使用者更新(派发更新)

这就是为什么你直接写 user.name = "李四" 就能触发更新!

常见误区澄清

❌ 误区1:“响应式对象就是监听属性变化”

  • 不完全是。它不只是“监听”,而是建立完整的依赖关系图,精准更新。

❌ 误区2:“所有对象都是响应式的”

  • 不是!只有通过 reactive()ref()computed() 创建的才是。

❌ 误区3:“响应式对象性能差”

  • Vue 3 的 Proxy + 编译时优化,性能非常好,只更新必要的部分。

×

喜欢就点赞,疼爱就打赏