Vue 3 reactive 函数:创建响应式对象的完整指南

更新日期: 2025-11-04 阅读: 24 标签: 响应式

vue 3 的 Composition api 中,reactive() 函数专门用来创建对象类型的响应式数据。无论是普通对象、数组、Map 还是 Set,reactive 都能让它们变成响应式的。


reactive 的基本用法

使用 reactive 前需要先引入:

import { reactive } from 'vue'

创建响应式对象很简单:

const user = reactive({
  name: '张三',
  age: 25,
  address: {
    city: '北京',
    street: '朝阳区'
  }
})

在模板中使用这些数据:

<template>
  <div class="person">
    <h2>{{ user.name }}</h2>
    <p>年龄: {{ user.age }}</p>
    <p>城市: {{ user.address.city }}</p>
  </div>
</template>


验证响应式特性

让我们添加按钮来验证数据的响应式特性:

<template>
  <div>
    <h2>{{ user.name }}</h2>
    <p>年龄: {{ user.age }}</p>
    <p>城市: {{ user.address.city }}</p>
    
    <button @click="incrementAge">增加年龄</button>
    <button @click="updateCity">更新城市</button>
  </div>
</template>

<script lang="ts" setup>
import { reactive } from 'vue'

const user = reactive({
  name: '张三',
  age: 25,
  address: {
    city: '北京',
    street: '朝阳区'
  }
})

const incrementAge = () => {
  user.age++
}

const updateCity = () => {
  user.address.city = '上海'
}
</script>

点击"增加年龄"按钮时,页面上的年龄显示会立即更新。点击"更新城市"按钮时,城市信息也会实时变化。这就是响应式数据的威力——数据变化时,界面自动更新。


处理数组和嵌套数据

reactive 同样适用于数组和复杂的嵌套结构:

const todos = reactive([
  { id: 1, text: '学习 Vue 3' },
  { id: 2, text: '掌握响应式' }
])

在模板中展示数组数据:

<template>
  <div>
    <h2>{{ user.name }}</h2>
    <p>年龄: {{ user.age }}</p>
    <p>城市: {{ user.address.city }}</p>
    
    <button @click="incrementAge">增加年龄</button>
    <button @click="updateCity">更新城市</button>
    
    <ul>
      <li v-for="todo in todos" :key="todo.id">
        {{ todo.text }}
      </li>
    </ul>
    
    <button @click="addTodo">添加任务</button>
  </div>
</template>

<script lang="ts" setup>
import { reactive } from 'vue'

const user = reactive({
  name: '张三',
  age: 25,
  address: {
    city: '北京',
    street: '朝阳区'
  }
})

const todos = reactive([
  { id: 1, text: '学习 Vue 3' },
  { id: 2, text: '掌握响应式' }
])

const incrementAge = () => {
  user.age++
}

const updateCity = () => {
  user.address.city = '上海'
}

const addTodo = () => {
  todos.push({
    id: todos.length + 1,
    text: `访问${user.address.city}`
  })
}
</script>

这里有几个重要概念:

  • v-for 指令用于循环渲染数组元素
  • :key="todo.id" 为每个元素提供唯一标识,帮助 Vue 高效更新
  • 使用 push 方法向响应式数组添加元素,界面会自动更新


深层响应式特性

reactive 创建的响应式对象具有深层响应性,即使是多层嵌套的对象也是响应式的:

<template>
  <div>
    <h2>嵌套对象值: {{ test.x.y.c }}</h2>
    <button @click="updateNestedValue">更新嵌套值</button>
  </div>
</template>

<script lang="ts" setup>
import { reactive } from 'vue'

const test = reactive({
  x: {
    y: {
      c: 666
    }
  }
})

const updateNestedValue = () => {
  test.x.y.c = 777
}
</script>

点击按钮时,即使修改的是深层嵌套的属性,界面也会正确更新。


reactive 的常见操作

对象操作

const state = reactive({
  user: {
    name: '李四',
    age: 30
  },
  settings: {
    theme: 'dark',
    language: 'zh-CN'
  }
})

// 修改属性
state.user.name = '王五'

// 添加新属性
state.user.gender = '男'

// 删除属性
delete state.user.age

数组操作

const list = reactive(['苹果', '香蕉', '橙子'])

// 添加元素
list.push('葡萄')

// 删除元素
list.splice(1, 1) // 删除第二个元素

// 修改元素
list[0] = '西瓜'

// 过滤数组
const filteredList = list.filter(item => item !== '香蕉')


reactive 与 ref 的区别

理解 reactive 和 ref 的区别很重要:

  • reactive 专门用于对象类型(对象、数组、Map、Set)

  • ref 可以用于任何类型,包括基本类型

  • reactive 返回的是原始对象的 Proxy 对象

  • ref 返回的是包含 value 属性的对象

import { reactive, ref } from 'vue'

// 使用 reactive 处理对象
const user = reactive({ name: '张三', age: 25 })

// 使用 ref 处理基本类型
const count = ref(0)
const message = ref('Hello')

// 使用 ref 处理对象(不推荐)
const userRef = ref({ name: '李四', age: 30 })
// 访问时需要 .value
console.log(userRef.value.name)


实际应用场景

表单处理

<template>
  <form @submit.prevent="handleSubmit">
    <input v-model="formData.username" placeholder="用户名">
    <input v-model="formData.email" placeholder="邮箱">
    <input v-model="formData.password" type="password" placeholder="密码">
    <button type="submit">注册</button>
  </form>
</template>

<script lang="ts" setup>
import { reactive } from 'vue'

const formData = reactive({
  username: '',
  email: '',
  password: ''
})

const handleSubmit = () => {
  console.log('提交数据:', formData)
  // 这里可以发送数据到服务器
}
</script>

购物车功能

<template>
  <div>
    <div v-for="item in cart.items" :key="item.id" class="cart-item">
      <span>{{ item.name }}</span>
      <span>¥{{ item.price }}</span>
      <span>数量: {{ item.quantity }}</span>
      <button @click="increaseQuantity(item.id)">+</button>
      <button @click="decreaseQuantity(item.id)">-</button>
    </div>
    <p>总价: ¥{{ cart.total }}</p>
  </div>
</template>

<script lang="ts" setup>
import { reactive, computed } from 'vue'

const cart = reactive({
  items: [
    { id: 1, name: '商品A', price: 100, quantity: 1 },
    { id: 2, name: '商品B', price: 200, quantity: 2 }
  ],
  total: computed(() => {
    return cart.items.reduce((sum, item) => sum + item.price * item.quantity, 0)
  })
})

const increaseQuantity = (id: number) => {
  const item = cart.items.find(item => item.id === id)
  if (item) item.quantity++
}

const decreaseQuantity = (id: number) => {
  const item = cart.items.find(item => item.id === id)
  if (item && item.quantity > 1) item.quantity--
}
</script>


注意事项

直接替换会失去响应性

// 错误做法
let state = reactive({ count: 0 })
state = { count: 1 } // 失去响应性

// 正确做法
Object.assign(state, { count: 1 })

解构会失去响应性

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

// 错误:解构后失去响应性
const { count, name } = state

// 正确:使用 toRefs 保持响应性
import { toRefs } from 'vue'
const { count, name } = toRefs(state)

响应式对象在异步中仍然有效

const state = reactive({ data: null })

setTimeout(() => {
  state.data = '异步数据' // 仍然响应式
}, 1000)


总结

reactive 是 Vue 3 Composition API 的核心功能之一,它让对象类型的数据变得响应式。无论是简单的对象、复杂的嵌套结构还是数组,reactive 都能很好地处理。

记住这些要点:

  • reactive 专门用于对象类型数据
  • 具有深层响应性,嵌套对象也是响应式的
  • 支持所有正常的 JavaScript 对象操作
  • 与 ref 配合使用可以覆盖所有数据类型需求

掌握 reactive 的使用,能够让你在 Vue 3 开发中更加得心应手,构建出响应迅速、用户体验良好的应用。

本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!

链接: https://fly63.com/article/detial/13133

移动端web app要使用rem实现自适应布局:font-size的响应式

rem是相对于根元素html,这样就意味着,我们只需要在根元素确定一个px字号,则可以来算出元素的宽高。

使用现代CSS的响应式版面

通过模块化缩放,使用传统属性和calc()来动态缩放你的字体大小.为字体大小使用百分比.给文本内容和媒体查询使用em,针对不同视口尺寸使用不同缩放值.视口越小,缩放比例越小,使用媒体查询或者media()函数基于视口来改变比例和基础字号

web响应式图片的5种实现

在目前的前端开发中,我们经常需要进行响应式的网站开发。本文着重介绍一下弹性图片,也就是响应式图片的解决方案:js或服务端、srcset 、sizes 、picture标签、svg图片

HTML5+CSS3响应式垂直时间轴,高端,大气

HTML5+CSS3响应式垂直时间轴,使用了HTML5标签<section>,时间轴中所有的内容包括标题、简介、时间和图像都放在.cd-timeline-block的DIV中,多个DIV形成一个序列,并把这些DIV放在<section>中。

实现响应式_CSS变量

CSS 变量是 CSS 引入的一个新特性,目前绝大多数浏览器已经支持了,它可以帮助我们用更少的代码写出同样多的样式,大大提高了工作效率,本篇文章将教你如何使用 CSS 变量(css variable)。CSS中原生的变量定义语法是:--*,变量使用语法是:var(--*),其中*表示变量名称

vue响应式原理及依赖收集

Vue通过设定对象属性的setter/getter方法来监听数据的变化,通过getter进行依赖收集,而每个setter方法就是一个观察者,在数据变更的时候通知订阅者更新视图。

vue响应式系统--observe、watcher、dep

Vue 最独特的特性之一,是其非侵入性的响应式系统。数据模型仅仅是普通的JavaScript 对象,而当你修改它们时,视图会进行更新,这使得状态管理非常简单直接,我们可以只关注数据本身

Responsive Web Design 响应式网页设计

常见的布局方案:固定布局:以像素作为页面的基本单位,不管设备屏幕及浏览器宽度,只设计一套尺寸;可切换的固定布局:同样以像素作为页面单位,参考主流设备尺寸

响应式布局的实现

响应式布局,即 Responsive design,在实现不同屏幕分辨率的终端上浏览网页的不同展示方式。通过响应式设计能使网站在手机和平板电脑上有更好的浏览阅读体验。响应式布局的关键不仅仅在于布局

深入响应式原理

说到响应式原理其实就是双向绑定的实现,说到 双向绑定 其实有两个操作,数据变化修改dom,input等文本框修改值的时候修改数据1. 数据变化 -> 修改dom;2. 通过表单修改value -> 修改数据

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!