Vue 3 企业级项目实战课
杨文坚
前阿里前端 Leader,前腾讯 IMWeb 团队高级前端工程师
6908 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
实战篇 (19讲)
Vue 3 企业级项目实战课
15
15
1.0x
00:00/00:00
登录|注册

05|响应式开发操作:如何理解和使用Vue 3的响应式数据?

你好,我是杨文坚。
你应该经常在一些技术文章或者博客听到 Vue.js 的“响应式编程”,那究竟什么是“响应式”?
“响应式”这个词放在不同技术场景下有不同含义,Vue.js 一开始就是一个“响应式”的前端模板库,简单来讲,这个语境里的“响应式”就是“页面的模板内容能随着数据变化而重新渲染”。Vue.js 最开始的响应式实现是基于 ES6 的一个 Object.defineProperty 的特性拦截监听数据变化,一旦监听到数据变化就触发对应依赖数据的模板重新渲染。
到了 Vue.js 的 3.x 版本,响应式就换成基于 ES6 的 Proxy 特性来实现的,Proxy 能监听一个对象的“读数据”和“写数据”的操作。最大的问题是因为 Vue.js 1.x 到 2.x 版本都是用的  Object.defineProperty 在监听数组变化时候,监听不到 Array.push 等数组变化操作,需要实现很多代码逻辑才能做好兼容。但用 Proxy 就能比较完美地直接监听数组的变化。
响应式开发是 Vue.js 框架的核心内容,开发者可以通过 Vue.js 的响应式的能力,直接用数据来驱动视图的变化,不需要写繁琐的 DOM 操作代码来处理视图的变化,可以让开发者能更加关注“如何设计数据来管理视图”,进而可以更加专注如何“根据业务逻辑来设计数据”,提升实现功能的开发效率。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Vue 3中的响应式数据是前端开发中的重要概念。本文通过详细的示例和解释,帮助读者快速了解Vue 3中响应式数据的核心概念和基本操作。文章首先解释了“响应式”在Vue.js中的含义,以及Vue 3中响应式数据的实现原理。作者通过示例代码演示了如何使用Vue 3的响应式API reactive和ref来声明响应式数据,并展示了它们在模板中的使用方式。此外,文章还讨论了如何选择合适的响应式API,包括toRaw用于解除响应式关系,以及watch用于监听响应式数据变化。文章还提到了在响应式开发中需要注意的一些问题,如属性解构可能导致响应式联系丢失、慎用浅层响应式作用API以及慎用副作用API。总的来说,本文是一份实用的技术指南,能够帮助前端开发者更好地理解和应用Vue 3的响应式开发特性。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Vue 3 企业级项目实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(6)

  • 最新
  • 精选
  • 趙學躍
    “Vue.js 最开始的响应式实现是基于 ES6 的一个 Object.defineProperty 的特性拦截监听数据变化”,Object.defineProperty是ES5提供的吧

    作者回复: 您好, 谢谢指正,纯属笔误,是ES5就有的。这里顺便补充一下tc39官方对Object.defineProperty 描述 https://tc39.es/ecma262/multipage/fundamental-objects.html#sec-object.defineproperty

    2022-12-28归属地:北京
    2
  • 文艺理科生
    最大的问题是因为 Vue.js 1.x 到 2.x 版本都是用的  Object.defineProperty 在监听数组变化时候,监听不到 Array.push 等数组变化操作 ——》通常都是用的push操作,应该是监听不到数组的索引相关操作吧

    作者回复: 您好,你的理解非常不错, Vue.js 1.x 和 2.x,在数据绑定中,对数组类型的监听做了很多额外的工作,原理是对Array原生一些方法做了特殊处理,才能使得数组变化能监听到。

    2022-12-08归属地:北京
    1
  • 都市夜归人
    watch( // 监听 state.text 的变化 [() => state.text ], ([ text ], [ prevText ]) => { // 当监听到state.text 变化,就会触发这个回调函数 state.zhCount = countZhText(text); } ) 这段语法不太理解,请问为何要将被监听的变量放到数组里?谢谢!

    作者回复: 您好,这个数组的写法是Vue.js 3的API定义的。 “watch当侦听多个来源时,回调函数接受两个数组,分别对应来源数组中的新值和旧值”。 具体可以参考官方文档 https://cn.vuejs.org/api/reactivity-core.html#watch

    2022-12-01归属地:江苏
    5
  • 风太大太大
    那么如果换成组合式 API(Options API)的开发方式,响应式功能的实现应该怎么操作? 1. 使用原vue2的写法,把响应的数据放在data函数的返回值中。只要后续直接this.xxx 修改这个值就是响应式。 2. 利用vue3的写法.使用setUp函数,照样可以使用reactive函数和ref函数。

    作者回复: 您好,你的回答非常好。

    2022-11-30归属地:湖北
    2
  • 01
    全文提到好几次JSON 数据。 但是对象并不是JSON
    2022-12-01归属地:福建
    2
    4
  • 风太大太大
    个人觉得文中有句话说的不是很合理,怕引起误会。“简单来讲,这个语境里的“响应式”就是“页面的模板内容能随着数据变化而重新渲染”。 这样是否合理,常规来看,这里这个语境里的“响应式”就是“页面的模板内容 及其他数据 能随着数据变化而重新渲染”。而实际响应式就是:当依赖的数据变化了,会更新使用这个数据相关的函数,内容模板是依赖数据试用的函数的一种,还有compute函数,watch函数等.
    2022-11-30归属地:湖北
    2
    3
收起评论
显示
设置
留言
6
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部