【前端】vue数据监测原理

news2024/12/27 18:52:26

问题展示:
在这里插入图片描述
点击按钮之后,vue中的persons数据改变,但是页面显示的内容没变。(先点击按钮再打开vue的数据面板可以看见改变,先打开后点击数据面板也不能显示改变。)
在这里插入图片描述
此时的更新代码:

methods:{
    updateMei:function(){
        this.persons[0] = {id:'001',name:'马老师',age:50,sex:'男'}
    }
}

没有问题的更新代码:
methods:{
//没问题的更新代码
updateMei:function(){
this.persons[0].name = “马保国” ;
this.persons[0].age = 50;
this.persons[0].sex = “男”;

}

}
有可能进行的是深度检测,在对象结构没发生变化的时候。

Vue数据监视原理
监视挂载步骤:
1.加工data:期望可以达到响应式数据更新的效果。—给对象的每个属性加get和set。

//不行的版本
// Object.defineProperty(data,'name',{
//     get(){
//         return data.name;
//     },
//     set(val){
//         data.name = val;
//     }
// })

上述不可行的方案原因是因为data.name调用的也是get的方法,因此会一直递归。set中的data.name=val也是set的方法,也会一直递归。

//创建一个监视的实例对象,用于监视data中的属性的变化
const obs = new Observer(data);

function Observer(obj){
    //汇总对象中的所有属性形成一个数组,获取所有的属性名
    const keys = Object.keys(obj);

    //遍历
    keys.forEach((k)=>{
        Object.defineProperty(this,k,{
            get(){
                return obj[k];
            },
            set(val){
                console.log(k+"改变了");
                obj[k] = val;
            }
        })
    })
}

上述可行是因为将get和set方法挂载在了obs对象上,只有调用obs.name去获取值以及设置值的时候才会使用get和set方法。如下图所示。
请添加图片描述
问题:为什么data改变的时候obs中的name也会变。
因为在obs对象中是引用了data的地址,并非自己创建了一个参数。跟c中一样。引用的是同一个对象。

在这里插入图片描述
2.vm._data = data = obs

Vue.set(target, key,val) / vm.$set(target, key,val)的使用
Api的作用:给vue对象data中的对象或者数组增加值。

//给对象加
Vue.set(vm.student,'sex','男’);

//给数组修改
Vue.set(vm.student.hobby,0,’打台球’);

到这可以解释为什么直接修改数组中的值不奏效,因为数组没有给它设置get和set方法。
在这里插入图片描述
那数组怎么修改。vue只承认js数组方法中更改原数据的方法对数组进行修改。用他们更改可以奏效,vue对他们进行了重写、包装。
在这里插入图片描述

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

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

相关文章

AI副业:别只顾刷黑神话悟空!AI做神话账号,商单月入过万(附教程)

前言 国产3A大作《黑神话:悟空》一经发布,瞬间登顶steam榜首,打破单机游戏在线记录,全球几十万国外玩家听着中文配音,看着翻译过来的英文字幕,玩的不亦乐乎! 甚至国外论坛上兴起了一股西游风&a…

eBest AI 大模型:智能化引领快消新未来

在快消品行业的高速变化中,数据与知识的管理、分析和应用变得至关重要。面对着日益增长的市场需求和顾客个性化的体验期望,如何利用技术提升效率、增强客户互动和优化销售策略?eBest GPT Hub,一个专为快消行业打造的AI大模型平台&…

第二节:Nodify 添加节点到编辑器中

引言 上节说到Nodify有三层结构,编辑器Editor,节点Node和连接组件Connection,下面就让我们来进行第一步尝试,在编辑器中添加一个节点。 在窗口中添加nodify命名空间,并添加控件。 xmlns:nodify"https://miroiu.…

docker 多线成服务,比如gunicorn服务启动报错解决办法

docker执行的时候报错,排查是线程创建权限不足导致的,报错如下。 解决办法 docker run -e OPENBLAS_NUM_THREADS1 your_image

淘宝商品评论API:评价内容中的关键词搜索与筛选

淘宝商品评论API为开发者提供了强大的工具,用于获取淘宝商品的评论信息,包括评价内容、评论评分、评论时间等。在评价内容中进行关键词搜索与筛选,是电商数据分析、用户行为研究以及商品质量监控等场景下的重要需求。以下是对这一过程的详细解…

EasyCVR视频汇聚平台革新播放体验:WebRTC协议赋能H.265视频流畅传输

随着科技的飞速发展和网络技术的不断革新,视频监控已经广泛应用于社会各个领域,成为现代安全管理的重要组成部分。在视频监控领域,视频编码技术的选择尤为重要,它不仅关系到视频的质量,还直接影响到视频的传输效率和兼…

智领云开源KDP:深度剖析其与主流数据平台的性能与特性对比

本文由智领云 LeetTools 工具自动生成 申请试用: https://www.leettools.com/feedback/ 在当今快速发展的技术环境中,数据平台的选择对企业的数字化转型和业务发展至关重要。本文将重点分析智领云开源KDP与其他数据平台的比较,探讨其在大数据…

[000-01-022].第03节:RabbitMQ环境搭建

我的后端学习大纲 RabbitMQ学习大纲 1.rpm包方式搭建: 1.1.搭建RabbitMQ单体架构: 1.MQ下载地址2.这里是提前下载好后上传安装包到服务器得opt目录下: 3.安装MQ需要先有Erlang语言环境,安装文件的Linux命令(分别按照以下顺序安装…

【多线程基础】Java线程的六种状态

Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 🌱🌱个人主页:奋斗的明志 🌱🌱所属专栏:Java多线程 📚本系列文章为个人…

重生奇迹MU 冲锋在前近战职业

刀光剑影,近战搏杀的乐趣是热爱近战职业的玩家享受最强体验。重生奇迹MU中有很多近战职业,每个职业都拥有独特的技能和玩法,在战斗中表现也各不相同。选择近战职业的玩家都是英勇者,敢于冲锋陷阵,迎击敌人,…

【CSP:202303-2】垦田计划(Java)

题目链接 202303-2 垦田计划 题目描述 求解思路 直接模拟:创建一个数组arr[],a[i]用来记录将第i天缩短所需要的资源数。在读取数据的时候直接对数组进行初始化。maxTime表示资源优化之前需要花费的最大天数。需要注意:在进行优化遍历时&am…

秋招力扣Hot100刷题总结——滑动窗口

1. 无重复字符的最长子串(手撕频率非常高) 题目要求:给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度。 代码及思路 使用一个hashmap维护已经出现过的字符遍历字符串,当字符已经存在时,根…

微服务实战系列之玩转Docker(十二)

前言 山一程,水一程,身向榆关那畔行,夜深千帐灯。——清纳兰性德 最近偶读纳兰的《长相思》经典之作,被这个“行军”场面震撼了。长长的队伍,跋山涉水,野宿一处。夜深人静的时候,突然激发了纳兰…

CSS3页面布局-三栏-固定宽度布局

布局的基本概念 多栏布局三种基本实现方案:固定宽度,流动,弹性。 固定宽度布局:大小不会随用户调整浏览器窗口大小。 一版960-1100,960常见,可以被3,4,5,6,8,10,12,16整除。 流动布局:大小会随用户调整…

芯片要火不要“热”!仿真技术助力芯片热设计

芯片散热仿真好比一场微观世界里的“清凉大作战”! 想象一下,小小的芯片就像迷你城市,无数的电子如同居民在其中穿梭。当芯片高速运转,就像城市进入了狂欢,热闹非凡但也会产生大量的热量。 而芯片散热仿真用数字和算法…

OpenStack前置配置与安装

环境:CentOS8最小化安装 九大组件: Nova:提供计算资源,cpu、内存等 Glance:提供镜像(查找)能力,真正存放镜像的是后端Swift。 Swift:对象存储,可以用来存放镜像。还可以用来存储备份。 Cin…

java生成黄红封面

import java.awt.*; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO;public class CoverGenerator {public static void generateCover(String name, String outputPath) {// A4纸的分辨率 (300 …

POJO、PO、DTO、VO、BO到底是什么?都如何使用?(基础概念+传输示意图+示例代码)带你一次玩转层出不穷的Object

文章目录 前言一、解释关系二、POJO、PO、DTO、VO、DAO、BO1.什么是POJO(Plain Old Java Object)2.什么是PO(Persistent Object)3.什么是DTO(Data Transfer Object)4.什么是VO(View Object&…

缓冲区

原理 #include <stdio.h> #include <string.h> int main() { const char *msg0"hello printf\n"; const char *msg1"hello fwrite\n"; const char *msg2"hello write\n"; printf("%s", msg0); fwrite(msg1, strlen(msg0)…

MySQL 数据页详解

数据页是MySQL 中定义的的一个存储结构 数据页是保存数据行的容器 页的16KB的大小是MySQL的⼀个默认设置&#xff0c;可以适用于⼤多数场景&#xff0c;当然也可以根据自己的实际业务场景进行修改页的大小&#xff0c;通过系统变量 innodb_page_size 进行调整与查看&#xff…