Vue:添加响应式数据

Vue:添加响应式数据

1. 什么是响应式?

修改 data 后,页面自动改变/刷新,这就是响应式。就像我们在使用 Excel 的时候,修改一个单元格中的数据,其它单元格的数据会联动更新,这也是响应式。在前端开发中,响应式是一种非常重要的特性,它使得页面能够根据数据的变化自动更新,提升了用户体验和开发效率。

2. Vue 的响应式是如何实现的?

数据劫持:Vue 底层使用了 Object.defineProperty,将 data 中的数据放到了 _data 中,在 _data 中配置了 setter 方法,当去修改属性值时,setter 方法则被自动调用,setter 方法中不仅修改了属性值,而且还做了其他的事情,例如:重新渲染页面。setter 方法就像半路劫持一样,所以称为数据劫持。

不过,在 Vue 3 中,响应式系统采用了 Proxy 对象来替代 Object.definePropertyProxy 提供了更强大和灵活的元编程能力,可以直接监听对象的属性变化,而不需要像 Object.defineProperty 那样逐个属性进行劫持,这在处理嵌套对象和数组时更加高效。

// Vue 3 响应式示例
import { reactive } from 'vue';const state = reactive({message: 'Hello, Vue 3!'
});// 修改属性,自动触发响应式更新
state.message = 'New message';

3. Vue 会给 data 中所有的属性,以及属性中的属性,都会添加响应式。

Vue 在初始化时,会递归地遍历 data 对象的所有属性,使用 Object.defineProperty(Vue 2)或 Proxy(Vue 3)为每个属性添加响应式。这意味着无论是直接的属性还是嵌套的属性,只要在 data 中定义,都能实现响应式更新。

4. 后期添加的属性,不会有响应式,怎么处理?

Vue.set(目标对象, ‘属性名’, 值)
vm.$set(目标对象, ‘属性名’, 值)

<body><div id="app"><h1>{{msg}}</h1><div>姓名:{{name}}</div><div>年龄:{{age}}岁</div><div>数字:{{a.b.c.e}}</div><div>邮箱:{{a.email}}</div></div><script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script><script>const vm = new Vue({el: "#app",data: {msg: "响应式与数据劫持",name: "jackson",age: 20,a: {b: {c: {e: 1,},},},},});// 1、测试:后期给 Vue 实例动态的追加的一些属性,会添加响应式处理吗?//vm.$data.a.email = 'jack@126.com'// 通过这种直接方式后期给 vm 追加的属性并没有添加响应式处理。//2、 如果你想给后期追加的属性添加响应式处理的话,调用以下两个方法都可以:// Vue.set() 、 vm.$set()//Vue.set(目标对象, 属性名, 属性值)//Vue.set(vm.$data.a, 'email', 'jack@126.com')//Vue.set(vm.a, 'email', 'jack@123.com')vm.$set(vm.a, "email", "jack@456.com");//3、 避免在运行时向 Vue 实例或其根 $data 添加响应式// 不能直接给 vm / vm.$data 追加响应式属性。只能在声明时提前定义好。//Vue.set(vm, 'x', '1')//Vue.set(vm.$data, 'x', '1')</script>
</body>

在 Vue 3 中,由于使用了 Proxy,可以直接通过 reactive 创建的对象添加属性,它会自动具备响应式。

import { reactive } from 'vue';const state = reactive({name: 'John'
});// 直接添加属性,自动具备响应式
state.age = 30;

5. Vue 没有给数组下标 0,1,2,3… 添加响应式,怎么处理?

① 调用 Vue 提供的 7 个 API:
push()
pop()
reverse()
splice()
shift()
unshift()
sort()
或者使用:
Vue.set(数组对象, ‘index’, 值)
vm.$set(数组对象, ‘index’, 值)

<body><!-- 1. 通过数组的下标去修改数组中的元素,默认情况下是没有添加响应式处理的。怎么解决?可以通过控制台去修改数组元素2. 第一种方案:vm.$set(数组对象, 下标, 值)  vm.$set(vm.users,0,'杰克')Vue.set(数组对象, 下标, 值)  vm.set(vm.users,0,'杰克')3. 第二种方案:push()    在数组 尾部逐个添加 元素,返回结果数组的长度,能接收任意数量参数,push() 修改了原数组。pop()  移除数组最后一项,返回的是被移除项。修改原数组reverse() 可将数组进行倒序,此方法会改变原数组。splice() 通过删除或替换现有元素或者原地添加新的元素来修改数组,并以数组形式返回被修改的内容。此方法会改变原数组。shift() 删除数组的第一项元素,返回被删除的元素, 修改原数组unshift() 向数组的头部添加元素,返回的是结果数组的长度,修改原数组sort() 可将数组项灵活地进行升序或降序排列,此方法会改变原数组。在 Vue 当中,通过以上的 7 个方法来给数组添加响应式处理。--><div id="app"><h1>{{msg}}</h1><ul><li v-for="user in users">{{user}}</li></ul><ul><li v-for="vip in vips" :key="vip.id">{{vip.name}}</li></ul></div><script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script><script>const vm = new Vue({el: "#app",data: {msg: "数组的响应式处理",users: ["jack", "lucy", "james"],vips: [{ id: "111", name: "zhangsan" },{ id: "222", name: "lisi" },],},methods: {update() {// this.users[0]='tom'// this.users.reverse()console.log(this.users);}}});</script>
</body>

在 Vue 3 中,使用 reactive 创建的数组也能自动处理数组元素的响应式更新,直接通过下标修改元素也会触发页面更新。

import { reactive } from 'vue';const state = reactive({numbers: [1, 2, 3]
});// 直接修改数组元素,自动触发响应式更新
state.numbers[0] = 10;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/898204.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法刷题记录——LeetCode篇(10) [第901~1000题](持续更新)

(优先整理热门100及面试150&#xff0c;不定期持续更新&#xff0c;欢迎关注) 994. 腐烂的橘子 在给定的 m x n 网格 grid 中&#xff0c;每个单元格可以有以下三个值之一&#xff1a; 值 0 代表空单元格&#xff1b;值 1 代表新鲜橘子&#xff1b;值 2 代表腐烂的橘子。 每…

Secs/Gem第二讲 (基于secs4net项目的ChatGpt介绍)

好的&#xff0c;我们正式进入&#xff1a; 第二讲&#xff1a;深入 SECS4NET 项目结构——主机程序是怎么搭起来的&#xff1f; 关键词&#xff1a;项目结构、类图、通信类、事件处理、连接生命周期、异步机制 本讲目的 我们从源码入手&#xff0c;一步步搞懂&#xff1a; S…

压测实战 | 微信小程序商城 “双 11” 的压测实践

背景 某全球知名珠宝品牌&#xff0c;始终以创新驱动零售变革。随着全渠道战略的深化&#xff0c;其小程序官方商城逐渐成为品牌私域流量的核心阵地&#xff0c;不仅承载了线上销售、会员运营等功能&#xff0c;同时还与其内部系统打通&#xff0c;如会员管理系统、人力资源系…

垃圾分类--环境配置

写在前面&#xff1a; 如果你们打这届比赛时&#xff0c;还有我们所保留的内存卡&#xff0c;那么插上即可运行&#xff08;因为内存卡里我们已经配置好所有的环境&#xff09; 本文提供两种环境的配置 一种是基于yolov8&#xff1a;YOLOv8 - Ultralytics YOLO Docshttps://d…

工具(十二):Java导出MySQL数据库表结构信息到excel

一、背景 遇到需求&#xff1a;将指定数据库表设计&#xff0c;统一导出到一个Excel中&#xff0c;存档查看。 如果一个一个弄&#xff0c;很复杂&#xff0c;耗时长。 二、写一个工具导出下 废话少絮&#xff0c;上码&#xff1a; 2.1 pom导入 <dependency><grou…

Postman 新手入门指南:从零开始掌握 API 测试

Postman 新手入门指南&#xff1a;从零开始掌握 API 测试 一、Postman 是什么&#xff1f; Postman 是一款功能强大的 API 开发与测试工具&#xff0c;支持 HTTP 请求调试、自动化测试、团队协作等功能。无论是开发人员还是测试工程师&#xff0c;都可以用它快速验证接口的正确…

运维工具推荐 -- 宝塔面板:一键部署服务器

标题&#xff1a;宝塔面板&#xff1a;一键部署服务器&#xff0c;轻松管理你的云端世界 引言 在数字化时代&#xff0c;服务器管理对于个人开发者、中小企业或站长来说既是机遇也是挑战。手动配置服务器环境耗时费力&#xff0c;而 宝塔面板 作为一款 免费开源、功能全面 的服…

【软件工程】03_软件需求分析

3.1 系统分析 1. 系统分析概述 系统分析是一组统称为计算机系统工程的活动。它着眼于所有的系统元素,而非仅仅局限于软件。系统分析主要探索软件项目的目标、市场预期、主要的技术指标等,其目的在于帮助决策者做出是否进行软件项目立项的决定。 2. 可行性分析(Feasibility …

WD5202L超低成本 Buck 电源芯片的特性与应用电路解析, 将市电转换为 5V 电压

WD5202L&#xff1a;超低成本 Buck 电源芯片的特性与应用电路解析 在现代电子设备的小型化、低成本化趋势下&#xff0c;对电源管理芯片的性能、成本和尺寸提出了严苛要求。WD5202L 作为一款超低成本的 Buck 电源芯片&#xff0c;凭借其独特的特性&#xff0c;在众多应用场景中…

UART转AHB模块ModelSim仿真

一、简介 UART转AHB模块用于实现一种简单的通过上位机控制FPGA内部寄存器的方式。上位机通过串口助手发送读写寄存器的指令&#xff0c;UART转AHB模块接收指令后解析出地址&#xff0c;命令&#xff0c;数据信息&#xff0c;然后转成AHB总线格式输出。这时UART转AHB模块相当于A…

Qt5.15.2实现Qt for WebAssembly与示例

目录 1.什么是Qt for WebAssembly&#xff1f; 1.1 什么是 WebAssembly&#xff1f; 1.2 WebAssembly 的优势 1.3 什么是 Qt for WebAssembly&#xff1f; 1.4 Qt for WebAssembly 的特点 1.5 编译过程 1.6 运行时环境 注意&#xff01;&#xff01;&#xff01;注意&am…

AGI大模型(8):提示词的安全与防护

1 前言 著名的「奶奶漏洞」&#xff0c;⽤套路把 AI 绕懵。 2 常⻅的提示词攻击技术 2.1 同类型⽬标劫持 同类⽬标劫持攻击&#xff0c;特别是在同类型任务的背景下&#xff0c;涉及到攻击者通过⾮法⼿段控制模型&#xff0c;并迫使其执行与原始任务性质相同但⽬标不同的操作…

使用redis客户端中对于json数据格式的存储和读取

代码背景&#xff1a; 现在有一个json格式的数据&#xff0c;但是由于redis客户端上面没办法直接创建/导入json的数据格式。 故考虑现在redis客户端上先存储一个名为"old_order"的string类型的的源数据。 思路&#xff1a; 由于直接使用redisTemplate获取自动导入…

专题三搜索插入位置

1.题目 题目分析&#xff1a; 给一个目标值&#xff0c;然后要在排序的整数数组中&#xff0c;找到跟目标值一样的&#xff0c;如果没有就把这个值插入进去&#xff0c;然后返回插入后的下标。 2.算法原理 根据题目的时间复杂度可以知道要用二分&#xff0c;开始划分区域&…

Redis监控:从睁眼瞎到千里眼的进化史

各位在Redis迷雾中摸黑的探险家们&#xff01;今天我们要给Redis装上"天眼系统"——从连自己内存爆了都不知道的睁眼瞎&#xff0c;进化到连每秒哪个键被摸了几次都门儿清的监控狂魔&#xff01;准备好迎接《Redisの楚门世界》了吗&#xff1f;&#x1f441;️ 第一幕…

双缓冲机制(含原理、优势、实现方式、应用场景)

双缓冲机制 一、双缓冲机制的原理二、双缓冲的典型应用场景三、双缓冲的优势四、双缓冲的实现方式1. 硬件级双缓冲2. 软件级双缓冲3. 性能提升对比 五、双缓冲的挑战与解决方案六、总结 双缓冲机制是一种通过使用两个缓冲区&#xff08;Buffer A 和 Buffer B&#xff09;来优化…

Linux 进程的创建、终止、等待与程序替换函数 保姆级讲解

目录 一、 进程创建 fork函数 二、进程的终止&#xff1a; 1. 想明白&#xff1a;终止是在做什么&#xff1f; 2.进程终止的3种情况&#xff1f; a.退出码是什么&#xff1f;存在原因&#xff1f;为什么int main&#xff08;&#xff09;return 0? b.第三种进程终止的情况…

深入了解Linux —— git三板斧

版本控制器git 为了我们方便管理不同版本的文件&#xff0c;就有了版本控制器&#xff1b; 所谓的版本控制器&#xff0c;就是能够了解到一个文件的历史记录&#xff08;修改记录&#xff09;&#xff1b;简单来说就是记录每一次的改动和版本迭代的一个管理系统&#xff0c;同…

STM32---FreeRTOS事件标志组

一、简介 事件标志位&#xff1a;用一个位&#xff0c;来表示事件是否发生 事件标志组&#xff1a;一组事件标志位的集合&#xff0c;可以简单的理解时间标志组&#xff0c;就是一个整体。 事件标志租的特点&#xff1a; 它的每一个位表示一个时间&#xff08;高8位不算&…

在centOS Linux系统搭建自动化构建工具Jenkins

前言 在工作中发现公司使用Jenkins实现自动化部署项目方案&#xff0c;于是闲着自己也捣鼓一下&#xff0c;网上查阅相关部署资料&#xff0c;顺便记录操作步骤&#xff0c;所以有了下面这篇的文章。 部署完之后&#xff0c;安装前端项目所需环境&#xff0c;比如node环境&am…