元素码农
基础
UML建模
数据结构
算法
设计模式
网络
TCP/IP协议
HTTPS安全机制
WebSocket实时通信
数据库
sqlite
postgresql
clickhouse
后端
rust
go
java
php
mysql
redis
mongodb
etcd
nats
zincsearch
前端
浏览器
javascript
typescript
vue3
react
游戏
unity
unreal
C++
C#
Lua
App
android
ios
flutter
react-native
安全
Web安全
测试
软件测试
自动化测试 - Playwright
人工智能
Python
langChain
langGraph
运维
linux
docker
工具
git
svn
🌞
🌙
目录
▶
Vue3 基础
▶
环境搭建
安装与配置
项目创建
开发工具
▶
模板语法
插值表达式
指令系统
事件处理
▶
核心概念
▶
响应式系统
ref与reactive
计算属性
侦听器
▶
组合式API
setup函数
生命周期钩子
自定义Hooks
▶
组件开发
▶
组件基础
组件通信
Props详解
插槽机制
▶
高级组件
动态组件
异步组件
递归组件
▶
状态管理
▶
Vuex基础
状态存储
模块化
组合式写法
▶
Pinia
创建Store
状态操作
插件机制
发布时间:
2025-03-22 12:10
↑
☰
# Vue3 响应式系统基础 - ref与reactive 本文将详细介绍Vue3响应式系统的基础知识,重点讲解ref和reactive这两个核心API的使用方法和最佳实践。 ## 响应式系统概述 Vue3的响应式系统是基于Proxy实现的,它可以自动追踪依赖关系并在数据变化时更新视图。主要提供了两个核心API:ref和reactive。 ## ref的使用 ### 1. 基础用法 ```vue <template> <div> <p>Count: {{ count }}</p> <button @click="increment">+1</button> </div> </template> <script setup> import { ref } from 'vue' const count = ref(0) const increment = () => { count.value++ } </script> ``` ### 2. ref的特点 1. **适用于基本类型** ```javascript const message = ref('Hello') const isActive = ref(true) const count = ref(0) ``` 2. **也可用于对象** ```javascript const user = ref({ name: 'John', age: 30 }) // 访问和修改属性 console.log(user.value.name) user.value.age = 31 ``` 3. **模板中的自动解包** ```vue <template> <div> <!-- 在模板中不需要.value --> <p>{{ message }}</p> <!-- 对象属性也会自动解包 --> <p>{{ user.name }}</p> </div> </template> <script setup> import { ref } from 'vue' const message = ref('Hello') const user = ref({ name: 'John', age: 30 }) </script> ``` ## reactive的使用 ### 1. 基础用法 ```vue <template> <div> <p>Name: {{ user.name }}</p> <p>Age: {{ user.age }}</p> <button @click="updateUser">Update User</button> </div> </template> <script setup> import { reactive } from 'vue' const user = reactive({ name: 'John', age: 30 }) const updateUser = () => { user.name = 'Jane' user.age = 25 } </script> ``` ### 2. reactive的特点 1. **只适用于对象类型** ```javascript // 对象 const state = reactive({ count: 0, message: 'Hello' }) // 数组 const list = reactive([ { id: 1, text: 'Item 1' }, { id: 2, text: 'Item 2' } ]) // Map const map = reactive(new Map()) map.set('key', 'value') // Set const set = reactive(new Set()) set.add('item') ``` 2. **深层响应性** ```javascript const state = reactive({ user: { profile: { name: 'John', age: 30 } } }) // 深层属性修改也是响应式的 state.user.profile.age = 31 ``` 3. **不需要.value** ```javascript const state = reactive({ count: 0 }) // 直接访问和修改 console.log(state.count) state.count++ ``` ## ref vs reactive ### 1. 使用场景比较 ```javascript // ref适合基本类型 const count = ref(0) const message = ref('Hello') const isActive = ref(true) // reactive适合复杂对象 const state = reactive({ user: { name: 'John', age: 30 }, settings: { theme: 'dark', notifications: true } }) ``` ### 2. 解构和传递 ```javascript // ref保持响应性 const user = ref({ name: 'John', age: 30 }) // 解构时保持响应性 const { name, age } = user.value // reactive失去响应性 const state = reactive({ name: 'John', age: 30 }) // 解构后失去响应性 const { name, age } = state ``` ## 最佳实践 ### 1. 选择原则 ```javascript // 1. 单一值使用ref const count = ref(0) const message = ref('Hello') // 2. 相关数据组合使用reactive const userState = reactive({ name: 'John', age: 30, email: 'john@example.com', preferences: { theme: 'dark', notifications: true } }) ``` ### 2. 组合使用 ```vue <template> <div> <h2>User Profile</h2> <p>Name: {{ userState.name }}</p> <p>Age: {{ userState.age }}</p> <p>Posts: {{ postCount }}</p> <button @click="incrementPosts">Add Post</button> </div> </template> <script setup> import { ref, reactive } from 'vue' // 复杂对象用reactive const userState = reactive({ name: 'John', age: 30, email: 'john@example.com' }) // 单个计数用ref const postCount = ref(0) const incrementPosts = () => { postCount.value++ } </script> ``` ### 3. 注意事项 ```javascript // 1. 避免解构reactive对象 const state = reactive({ count: 0 }) // 错误:解构后失去响应性 const { count } = state // 正确:使用计算属性 import { computed } from 'vue' const count = computed(() => state.count) // 2. ref对象嵌套 const user = ref({ name: 'John', age: ref(30) // 避免这样嵌套ref }) // 3. 保持响应式引用 const state = reactive({ user: { name: 'John', age: 30 } }) // 错误:会失去响应性 state.user = { name: 'Jane', age: 25 } // 正确:保持响应性 Object.assign(state.user, { name: 'Jane', age: 25 }) ``` ## 总结 本文详细介绍了Vue3响应式系统的基础知识: 1. ref的使用 - 基础用法 - 特点和限制 - 自动解包机制 2. reactive的使用 - 基础用法 - 深层响应性 - 使用限制 3. 最佳实践 - 选择原则 - 组合使用 - 常见陷阱 通过合理使用ref和reactive,可以构建出高效、可维护的响应式系统。建议在实际开发中根据数据的类型和使用场景选择合适的API,并注意避免常见的陷阱。