0

0

什么是Vue.js_它的响应式数据绑定是如何工作的【教程】

夜晨

夜晨

发布时间:2026-01-16 19:12:50

|

291人浏览过

|

来源于php中文网

原创

vue.js响应式基于object.defineproperty(vue 2)或proxy(vue 3)劫持读写;vue 2需vue.set新增属性,vue 3 proxy全面支持数组、map等且无需set,ref/reactive分工保障类型安全与解构可用性。

什么是vue.js_它的响应式数据绑定是如何工作的【教程】

Vue.js 的响应式数据绑定不是靠轮询或脏检查,而是通过 JavaScript 的 Object.defineProperty(Vue 2)或 Proxy(Vue 3)劫持数据的读取和修改过程,自动触发视图更新。

Vue 2 中的 Object.defineProperty 是怎么用的

Vue 2 把 data 对象的每个属性都用 Object.defineProperty 重新定义,为它们添加 gettersetter

  • getter 被读取时,会把当前正在执行的渲染函数(Watcher)收集为依赖
  • setter 被触发时,会通知所有已收集的 Watcher 重新求值,从而更新 DOM
  • 这个机制只对初始化时就存在的属性生效;新增属性默认不响应,需用 Vue.set()this.$set()

例如,直接写 this.newProp = 'hello' 不会触发更新,但 this.$set(this, 'newProp', 'hello') 可以。

Vue 3 的 Proxy 带来了哪些实际变化

Proxy 替代 Object.defineProperty 后,响应式能力更完整:

立即学习前端免费学习笔记(深入)”;

HaiSnap
HaiSnap

一站式AI应用开发和部署工具

下载
  • 支持数组索引赋值(arr[0] = 1)、length 修改、新增/删除属性,全部自动响应
  • 能监听 MapSetWeakMap 等原生集合类型(Vue 2 完全不支持)
  • 不再需要 Vue.set,也不再有“初始化后无法响应新属性”的限制
  • Proxy 无法被 polyfill,所以 Vue 3 不支持 IE
const state = reactive({ count: 0 });
state.count++; // 触发更新
state.list = [1, 2]; // 新增属性,也响应
state.list.push(3); // 数组方法调用,同样响应

为什么 ref()reactive() 要分开设计

这是为了覆盖不同使用场景下的类型安全与语法便利性:

  • reactive() 接收对象,返回响应式代理,但不能直接解构(解构后失去响应性)
  • ref() 可包装任意类型(包括原始值),暴露 .value 属性,适合在组合式 API 中配合解构、传参、逻辑复用
  • 模板中使用 ref 时可省略 .value(Vue 自动展开),但 JS 逻辑里必须显式写

常见错误:在 setup() 里解构 reactive 对象后赋值,比如 const { name } = reactive({ name: 'Alice' }); name = 'Bob' —— 这不会触发更新。

响应式失效的典型场景和绕过方式

即使用了 refreactive,以下情况仍会丢失响应性:

  • 用解构、展开运算符({...obj})、Object.assign 复制响应式对象 → 得到的是普通对象
  • 将响应式对象作为参数传入普通函数,且该函数内部直接赋值(未通过 .valueset
  • 异步回调中修改响应式数据,但回调没在组件实例或 setup() 作用域内(比如全局定时器、第三方 SDK 回调)

绕过方式:始终通过原始引用操作(如 state.count++),或用 toRaw() + markRaw() 显式排除某些对象进入响应式系统(比如大型不可变数据或 DOM 元素)。

真正难的不是理解“谁变了谁更新”,而是搞清什么时候引用断了、什么时候代理丢了、什么时候 Vue 根本没机会拦截——这些地方一错,控制台安静得可怕,但界面就是不动。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1561

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

241

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

128

2025.10.17

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

201

2023.11.20

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

557

2023.09.20

length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

952

2023.09.19

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

77

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

39

2025.11.16

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

23

2026.03.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Vue 教程
Vue 教程

共42课时 | 9.1万人学习

Vue3.x 工具篇--十天技能课堂
Vue3.x 工具篇--十天技能课堂

共26课时 | 1.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号