首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
10.1 注册自定义指令
10.1.1 全局自定义指令
10.1.2 局部自定义指令
10.2 钩子函数
10.3 绑定值的类型
10.3.1 绑定数值
10.3.2 绑定字符串
10.3.3 绑定对象字面量
11.1 注册组件
11.1.1 注册全局组件
11.1.2 注册局部组件
11.2 向子组件传递数据
11.2.1 Prop基本用法
11.2.2 数据验证
11.3 监听子组件事件
11.3.1 监听自定义事件
11.3.2 监听原生事件
11.4 插槽的使用
11.4.1 基础用法
11.4.2 编译作用域
11.4.3 默认内容
11.4.4 命名插槽
11.4.5 作用域插槽
11.5 混入
11.5.1 基础用法
11.5.2 选项合并
11.6 动态组件
11.6.1 动态组件的用法
11.6.2 缓存效果
12.1 什么是组合API
12.2 setup()函数
12.3 响应式API
12.3.1 reactive()方法
12.3.2 watchEffect()方法
12.3.3 ref()方法
12.3.4 computed()方法
12.3.5 watch()方法
12.4 生命周期钩子函数
12.5 使用ref获取DOM元素
13.1 单元素过渡
13.1.1 CSS过渡
13.1.2 过渡的类名
13.1.3 自定义过渡的类名
13.1.4 CSS动画
13.1.5 使用JavaScript钩子函数实现动画
13.2 多元素过渡
13.2.1 多元素过渡的用法
13.2.2 设置元素的key属性
13.2.3 过渡模式的设置
13.3 多组件过渡
13.4 列表过渡
14.1 什么是虚拟DOM
14.2 render()函数的使用
14.2.1 基本用法
14.2.2 h()函数
14.3 使用JavaScript代替模板功能
15.1 路由基础
15.1.1 引入Vue Router
15.1.2 基本用法
15.1.3 动态路由匹配
15.1.4 命名路由
15.2 编程式导航
15.3 嵌套路由
15.4 命名视图
15.5 高级用法
15.5.1 beforeEach钩子函数
15.5.2 scrollBehavior方法
当前位置:
首页>>
技术小册>>
Vue.js从入门到精通(三)
小册名称:Vue.js从入门到精通(三)
### 12.3.1 reactive() 方法:Vue 3 响应式系统的基石 在 Vue.js 的演进过程中,Vue 3 带来了许多重大的改进,其中最为显著的变化之一是其全新的响应式系统。这一系统基于 Proxy 替代了 Vue 2 中的 Object.defineProperty,极大地提升了性能并简化了响应式状态的管理。而 `reactive()` 方法,作为这一新响应式系统的核心函数之一,扮演着至关重要的角色。本章将深入剖析 `reactive()` 方法的原理、用法、以及它在 Vue 3 应用开发中的实际应用。 #### 12.3.1.1 理解 `reactive()` 方法 `reactive()` 是 Vue 3 Composition API 中的一个函数,用于将一个普通的 JavaScript 对象转换成响应式对象。这意味着,当你修改这个对象的属性时,任何依赖于这些属性的视图或计算属性都会自动更新。这一机制是通过在对象内部使用 Proxy 实现的,Proxy 能够拦截并处理对象属性的读取、设置、枚举、函数调用等操作,从而在不改变原始对象结构的前提下,添加响应式逻辑。 #### 12.3.1.2 基本用法 在 Vue 3 组件中,你可以直接在 `setup()` 函数内部使用 `reactive()` 方法来定义响应式状态。这里是一个简单的示例: ```javascript import { reactive } from 'vue'; export default { setup() { const state = reactive({ count: 0, name: 'Vue 3' }); function increment() { state.count++; } return { state, increment }; } } ``` 在上述代码中,`reactive({ count: 0, name: 'Vue 3' })` 创建了一个响应式对象 `state`,它包含了 `count` 和 `name` 两个属性。随后,在模板中或计算属性、侦听器等地方引用 `state.count` 或 `state.name` 时,Vue 将能够追踪这些依赖,并在它们发生变化时自动更新相关的 DOM。 #### 12.3.1.3 深度响应性 与 Vue 2 中的 `Vue.observable()`(现已废弃)或手动使用 `Object.defineProperty` 不同的是,`reactive()` 提供的响应性是深度的。这意味着,如果 `state` 对象内部包含了其他对象或数组,这些嵌套的对象或数组也会自动变成响应式的。例如: ```javascript const nestedState = reactive({ user: { name: 'Alice', age: 30, addresses: [ { city: 'New York', street: '123 Main St' }, { city: 'Los Angeles', street: '456 Elm St' } ] } }); // 修改嵌套对象的属性也会触发响应式更新 nestedState.user.age = 31; nestedState.user.addresses[0].city = 'San Francisco'; ``` #### 12.3.1.4 响应式原理与限制 `reactive()` 背后的核心原理是 JavaScript 的 Proxy 对象。Proxy 允许你拦截并定义对象的基本操作,如属性查找、赋值、枚举、函数调用等。Vue 3 使用 Proxy 来拦截对象的属性访问和修改,从而能够在这些操作发生时执行依赖追踪和派发更新。 然而,需要注意的是,并不是所有的 JavaScript 值都能被 `reactive()` 转换成响应式的。特别是原始数据类型(如数字、字符串、布尔值)和不可变的数据结构(如 `Date`、`RegExp`、`Map`、`Set` 等)在默认情况下是不会被 `reactive()` 处理的。对于这些类型的响应式处理,Vue 3 提供了其他的方法,如 `ref()` 用于基本数据类型,以及 `reactive()` 的变种或组合使用来应对复杂场景。 #### 12.3.1.5 高级应用与最佳实践 1. **组合使用 `reactive()` 和 `ref()`**: 在复杂的 Vue 组件中,你可能需要同时使用 `reactive()` 和 `ref()` 来管理不同类型的响应式数据。例如,可以使用 `reactive()` 管理复杂的对象状态,而用 `ref()` 来存储基本数据类型的响应式引用。 2. **性能优化**: 虽然 `reactive()` 提供的深度响应性非常强大,但在处理大型对象或深层嵌套的数据结构时,过多的依赖追踪和更新可能会导致性能问题。因此,合理划分响应式状态的范围,避免不必要的响应式转换,是优化 Vue 应用性能的关键。 3. **避免直接修改响应式对象的结构**: 虽然 Vue 3 的响应式系统能够处理许多类型的属性修改,但直接修改响应式对象的结构(如添加或删除属性)可能不会触发视图更新。在需要修改对象结构时,应使用 Vue 提供的方法(如 `Vue.set()` 在 Vue 2 中,Vue 3 中则通常通过重新赋值来实现)。 4. **使用计算属性和侦听器**: 在 `setup()` 函数中,可以结合使用 `computed` 和 `watch`/`watchEffect` 来进一步利用响应式系统的能力。计算属性允许你基于响应式状态派生新的状态,而侦听器则允许你在响应式状态变化时执行异步操作或副作用。 #### 12.3.1.6 结论 `reactive()` 方法作为 Vue 3 响应式系统的核心之一,为开发者提供了一种强大而灵活的方式来管理组件的状态。通过深入理解其原理、掌握其基本用法和高级应用技巧,你将能够更有效地利用 Vue 3 的新特性来构建高效、可维护的 Web 应用。随着 Vue 3 生态的不断发展,相信 `reactive()` 方法及其背后的响应式系统将在未来的前端开发中发挥越来越重要的作用。
上一篇:
12.3 响应式API
下一篇:
12.3.2 watchEffect()方法
该分类下的相关小册推荐:
TypeScript和Vue从入门到精通(五)
Vue3技术解密
TypeScript和Vue从入门到精通(二)
移动端开发指南
vue项目构建基础入门与实战
Vue.js从入门到精通(一)
VUE组件基础与实战
TypeScript和Vue从入门到精通(四)
Vue源码完全解析
Vue原理与源码解析
TypeScript和Vue从入门到精通(一)
Vue.js从入门到精通(二)