iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > VUE >什么是Vue响应式系统
  • 112
分享到

什么是Vue响应式系统

2024-04-02 19:04:59 112人浏览 八月长安
摘要

什么是Vue响应式系统,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。响应式系统(Reactivity systems)是现代前端框架的关键部分

什么是Vue响应式系统,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

响应式系统(Reactivity systems)是现代前端框架的关键部分之一。应用系统的的高度交互性、动态性和响应能力全靠它支持。每个web开发人员而言都应该了解这一系统的功能和实践操作。

原理

响应系统是一种使自动使数据源(模型)与数据表示(视图)层自动保持同步的机制。每次模型更改时,都会重新渲染视图。

以一个简单的markdown编辑器为例。通常编辑器有两个窗格:一个窗格用于编写Markdown代码(用于修改基础模型),另一个窗格用于预览已编译的html(显示已更新的视图)。当我们在书写窗格中写东西时,它会立即在预览窗格中自动预览。这个例子比较简单,在实际情况中会复杂很多。

在许多情况下,我们要显示的数据取决于其他数据。在这种情况下,需要跟踪相关数据,并根据跟踪情况来更新数据。例如,我们有一个fullName,该属性由firstName和lastName属性组成。修改其任何依赖项后,fullName将自动重新评估,并在视图中显示结果。

了解什么是响应式系统后,在了解Vue 3中的响应系统如何工作以及如何在实践中使用之前,让我们一起来快速回顾一下Vue 2中的响应系统内容及其注意事项。

Vue 2的响应式系统简介

Vue 2中的响应或多或少会被“隐藏”。无论我们放置在data对象中的是什么,Vue都会使其隐式反应(reactive implicitly)。这样虽然可以使开发人员的工作更加轻松,但灵活度却会不可避免的降低。

在幕后,Vue 2使用ES5 Object.defineProperty将data对象的所有属性转换为getter和setter。对于每个组件实例,Vue创建一个依赖关系观察程序实例,观察者会记录组件渲染期间依赖收集/跟踪的任何属性。当属性触发依赖项的设置器时,将通知观察者,并将组件重新渲染并更新视图。但是却也会有一些问题存在。

变更检测警告

由于Object.defineProperty方法的限制,Vue无法检测到某些数据更改。包括:

  • 给对象添加属性或把对象移除属性(例如obj.newKey = value)

  • 索引设置数组项(例如arr[index] = newValue)

  • 修改数组的长度(例如arr.length = newLength)
    不过为了解决这些问题, Vue为提供了Vue.set api方法,该方法向响应对象添加了一个属性,确保新属性也是响应性的,从而触发了视图更新。

用下述实例讨论该情况:

  <h2>Hello! My name is {{ person.name }}. I'm {{ person.age }} years old.</h2>   <button @click="addAgeProperty">Add "age" property</button>   <p>Here are my favorite activities:</p>   <ul>     <li v-for="item, index in activities" :key="index">       {{ item }}       <button @click="editActivity(index)">Edit</button>     </li>   </ul>   <button @click="clearActivities">Clear the activities list</button> </div>
el: '#app',   data: {     person: {       name: "David"     },     activities: [       "Reading books",       "Listening music",       "Watching TV"     ]   },   methods: {      // 1. Add a new property to an object     addAgeProperty() {       this.person.age = 30     },     // 2. Setting an array item by index     editActivity(index) {       const newValue = prompt('Input a new value')       if (newValue) {         this.activities[index] = newValue       }     },     // 3. Modifying the length of the array     clearActivities() {        this.activities.length = 0      }   } });

在上面的示例中,我们会发现这三种方法都不起作用。我们不能向该person对象添加新属性,无法使用activities的索引来编辑数组中的项目,也不能修改activities数组的长度。

优化如下:

el: '#app',   data: {     person: {       name: "David"     },     activities: [       "Reading books",       "Listening music",       "Watching TV"     ]   },   methods: {      // 1. Adding a new property to the object     addAgeProperty() {       Vue.set(this.person, 'age', 30)     },     // 2. Setting an array item by index     editActivity(index) {       const newValue = prompt('Input a new value')       if (newValue) {         Vue.set(this.activities, index, newValue)       }     },     // 3. Modifying the length of the array     clearActivities() {        this.activities.splice(0)     }   } });

在此示例中,我们用Vue.setAPI方法将新age属性添加到person对象,并从活动数组中选择/修改特定项目。在最后一种情况下,使用javascript内置splice方法。

这个做法完全可行但却略显笨拙,而且会导致前后代码不一致。而Vue 3就解决了这个问题。

我们用下面示例继续看:

data() {     return {       person: {         name: "David"       },       activities: [         "Reading books",         "Listening music",         "Watching TV"       ]     }   },   methods: {      // 1. Adding a new property to the object     addAgeProperty() {       this.person.age = 30     },     // 2. Setting an array item by index     editActivity(index) {       const newValue = prompt('Input a new value')       if (newValue) {         this.activities[index] = newValue       }     },     // 3. Modifying the length of the array     clearActivities() {        this.activities.length = 0      }   } }  Vue.createApp(App).mount('#app')

可以看到在Vue 3中,所有方法都可以正常工作。

在Vue 2.6中,引入的Vue.observable API方法,一定程度的公开了响应式系统,使开发人员可以体验到响应式系统的内容。实际上,这和Vue内部用来包装data对象是完全相同的方法,对于在简单场景创建小的跨组件状态存储很有用。但依旧没办法和vue3的响应式系统相比,接下来就为大家详细介绍。

注意:由于Object.defineProperty方法是仅限ES5且不可调整的功能,因此Vue 2不支持IE8及以下版本。

Vue 3响应式系统如何工作

为了充分利用es6 Proxy and Reflect API ,Vue 3中的响应式系统已被完全重写。新版本新增响应式API,该API使系统比以前更加灵活和强大。

Proxy API允许开发人员拦截和修改目标对象上的更低级对象操作。代理(proxy)是对象的克隆/包装(clone/wrapper),并提供特殊功能(称为target),这些功能响应特定的操作并覆盖JavaScript对象的内置行为(称为traps)。如果仍然需要使用默认行为,则可以使用相应的Reflection API,其名称顾名思义就是反映Proxy API的方法。这里有一个示例,用来了解如何在Vue 3中使用这些API:

name: "David",   age: 27 };  const handler = {   get(target, property, receiver) {     // track(target, property)     console.log(property) // output: name     return Reflect.get(target, property, receiver)   },   set(target, property, value, receiver) {     // trigger(target, property)     console.log(`${property}: ${value}`) // output: "age: 30" and "hobby: Programming"     return Reflect.set(target, property, value, receiver)   } }  let proxy = new Proxy(person, handler);     console.log(person)  // get (reading a property value) console.log(proxy.name)  // output: David  // set (writing to a property) proxy.age = 30;  // set (creating a new property) proxy.hobby = "Programming";  console.log(person)

要创建一个新的代理,使用new Proxy(target, handler)构造函数。它带有两个参数:目标对象(person对象)和处理程序对象,该对象定义将拦截哪些操作(get和set操作)。在handler对象中, get和set陷阱来跟踪何时读取属性以及何时修改/添加属性。设置控制台语句以确保运行正确。

在get和set陷阱采用下列参数:

  • target:代理包装的目标对象

  • property:属性名称

  • value:属性值(此参数仅用于设置操作)

  • receiver:进行操作的对象(通常是代理)

  • Reflect API方法与其相应的代理方法接受相同的参数

注释中track函数和trigger函数特定用于Vue,用于跟踪何时读取属性以及何时修改/添加属性。

在示例的最后一部分,用控制台语句输出原始person对象。然后用另一份声明中读取属性name的proxy对象。接下来,修改age属性并创建一个新hobby属性。最后,再次输出该对象以查看它是否正确更新。

以上就是Vue3响应式系统的完整工作流程,但在实际工作中会复杂得多。

使用Vue 3响应式系统,还有一些注意事项:

  • 仅适用于支持ES6 +的浏览器

  • 响应代理不等于原始对象

看完上述内容,你们掌握什么是Vue响应式系统的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网VUE频道,感谢各位的阅读!

--结束END--

本文标题: 什么是Vue响应式系统

本文链接: https://www.lsjlt.com/news/81096.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 什么是Vue响应式系统
    什么是Vue响应式系统,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。响应式系统(Reactivity systems)是现代前端框架的关键部分...
    99+
    2024-04-02
  • Vue中响应式系统实现原理是什么
    本篇内容介绍了“Vue中响应式系统实现原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!框架每个组件实例都会对应一个watcher实例...
    99+
    2023-07-05
  • vue响应式原理是什么
    Vue 的响应式原理是通过数据劫持(Object.defineProperty)实现的,其核心思想是将数据模型和视图模型进行双向绑定...
    99+
    2023-05-13
    vue响应式原理 vue
  • Vue中数据响应式是什么
    这篇文章将为大家详细讲解有关Vue中数据响应式是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1. ES语法的getter和setter在开始了解 Vue 的数据响应式原理前应该先搞清楚 ES语法 中...
    99+
    2023-06-15
  • Vue中响应式原理是什么
    这篇文章主要介绍“Vue中响应式原理是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue中响应式原理是什么”文章能帮助大家解决问题。响应式在日常开发中的应用是很常见的,这里举个简单的例子:le...
    99+
    2023-07-05
  • Vue的响应式原理是什么
    本篇内容介绍了“Vue的响应式原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Depvar Dep = ...
    99+
    2023-06-20
  • 怎么理解Vue 3.0的响应式系统
    这篇文章主要介绍“怎么理解Vue 3.0的响应式系统”,在日常操作中,相信很多人在怎么理解Vue 3.0的响应式系统问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么理解Vu...
    99+
    2024-04-02
  • Vue2响应式系统有什么用
    这篇文章主要讲解了“Vue2响应式系统有什么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue2响应式系统有什么用”吧!一、响应式系统要干什么回到最简单的代码:data =&n...
    99+
    2023-06-30
  • Vue响应式系统的原理详解
    目录vue响应式系统的基本原理1.回顾一下Object.defineProperty的用法2.实战1:使用 Object.defineProperty 对 person的age属性 ...
    99+
    2024-04-02
  • Vue数据响应式原理是什么
    本文小编为大家详细介绍“Vue数据响应式原理是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue数据响应式原理是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。响应式是什么简而言之就是数据变页面变如何实...
    99+
    2023-06-30
  • Vue响应式流程及原理是什么
    本文小编为大家详细介绍“Vue响应式流程及原理是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue响应式流程及原理是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、组件化流程1. 整个new Vue...
    99+
    2023-07-02
  • Vue2 响应式系统之深度响应
    目录1、场景2、方案3、场景24、总结1、场景 import { observe } from "./reactive"; import Watcher from "./watche...
    99+
    2024-04-02
  • Vue 中数据响应式的原理是什么
    Vue 中数据响应式的原理是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。改造数据我们先来尝试写一个函数,用于改造对象:为什么要先写这个函...
    99+
    2024-04-02
  • Vue 3.0进阶之什么是响应式Refs API
    这期内容当中小编将会给大家带来有关Vue 3.0进阶之什么是响应式Refs API,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、ref该函数接受一个内部值并返回一个响...
    99+
    2024-04-02
  • Vue 3中响应式的实现原理是什么
    本篇文章给大家分享的是有关Vue 3中响应式的实现原理是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1. 实现响应式响应基本类型变量首先...
    99+
    2024-04-02
  • Vue2响应式系统介绍
    目录一、响应式系统要干什么二、响应式数据三、保存当前正在执行的函数四、响应式数据五、Observer 对象六、测试七、总结前言: 目前工作中大概有 的需求是在用 ...
    99+
    2024-04-02
  • 浅谈Java响应式系统
    目录初识响应式系统什么是响应式系统响应式系统的四大特点及时响应性(Responsive)恢复性(Resilient)有弹性(Elastic)消息驱动(Message Driven)总...
    99+
    2024-04-02
  • vue处理响应式数据的方法是什么
    这篇“vue处理响应式数据的方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue处理响应式数据的方法是什么”文章吧...
    99+
    2023-07-05
  • 什么是响应式编程
    本篇内容介绍了“什么是响应式编程”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!最近几年,随着Go、Node...
    99+
    2024-04-02
  • Vue2响应式系统之深度响应怎么实现
    本文小编为大家详细介绍“Vue2响应式系统之深度响应怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue2响应式系统之深度响应怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1、场景import&...
    99+
    2023-06-30
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作