一、先聊聊天:什么是“响应式”?
想象一下你网购了一个快递,物流信息每次更新,你都能自动收到短信通知——这就是“响应式”的日常版。
在Vue的世界里,数据就是你的快递,当数据变化时,页面会自动更新,这就是Vue的响应式系统。
二、Vue2的响应式:像个认真的“抄表员”
1. 核心原理
Vue2用Object.defineProperty
给数据贴“小纸条”(劫持属性),每次数据被修改时,Vue就能知道并通知页面更新。
2. 代码演示
let data = { name: '小明' };
Object.defineProperty(data, 'name', {
get() {
console.log('有人读取name啦!');
return this._name;
},
set(newVal) {
console.log('有人修改name啦!');
this._name = newVal;
// 触发页面更新(虚拟DOM操作)
}
});
data.name = '小红'; // 控制台输出:有人修改name啦!
3. Vue2的痛点
新增属性不认:就像快递员只认识初始包裹,后来加的东西他不管。
data.age = 18; // 这个改动页面不更新!
数组要特殊照顾:直接改数组长度或通过下标改元素,页面不更新。
data.list[0] = '新内容'; // 页面无反应!
三、Vue3的响应式:升级成“智能摄像头”
1. 核心原理
Vue3改用ES6的Proxy
代理整个对象(而不是单个属性),像摄像头一样监控整个数据区域。
2. 代码演示
// Vue3的简易版响应式
let data = { name: '小明' };
const proxyData = new Proxy(data, {
get(target, key) {
console.log(`有人读取${key}啦!`);
return target[key];
},
set(target, key, value) {
console.log(`有人修改${key}啦!`);
target[key] = value;
// 触发页面更新
return true;
}
});
proxyData.name = '小红'; // 触发set
proxyData.age = 18; // 新增属性也能触发!
3. Vue3的优化亮点
- 新增属性直接监控:快递员升级成仓库管理员,包裹里多放少放东西他全知道。
- 数组改动轻松感知:
data.list.push('新内容'); // 页面自动更新!
- 性能提升:Proxy是浏览器原生支持,比
Object.defineProperty
更快。
四、Vue3的贴心小工具:ref和reactive
1. reactive:处理对象
import { reactive } from 'vue';
const state = reactive({ count: 0 });
state.count++; // 页面自动更新
2. ref:处理基本类型(数字、字符串)
import { ref } from 'vue';
const age = ref(18);
age.value++; // 注意要用.value访问!
3. 为什么分两种?
reactive
专治对象(比如表单数据)ref
能包装任何类型(比如单个数字、DOM元素)
五、总结:Vue3响应式的三大优势
- 监控更全面:Proxy天生支持新增属性和数组变化。
- 性能更优秀:减少递归遍历对象的开销。
- 代码更简洁:一套API统一处理对象和基础类型。
六、给新手的建议
- 优先用reactive处理对象,少写
.value
更省心。 - 遇到数组别用下标改,多用
push
、splice
等标准方法。 - Vue3的响应式就像智能家居——你只需要关心数据,剩下的交给它自动处理!