Vue2(四):Vue监测数据的原理

一、先来看一个问题

添加一个按钮点击更新马冬梅的信息:

<button @click="gengxin">点击更新马冬梅的信息</button>
methods:{
            gengxin(){
                this.person[1].name='马老师',
                this.person[1].age=50,
                this.person[1].sex='男'
            }
        }

下面这种方式就不能奏效,但是在控制台查看person[1]姓名年龄啥的都是更改之后的。如果先点击按钮在点击vue后台可以看到信息更改页面却不更改,先点击vue后台就vue也没改页面也没改,这是为啥呢?

 this.person[1]={id:'002',name:'马老师',age:'50',sex:'男'}

二、Vue监视对象改变的原理

我们写的data是要传入的数据,传入到vm._data,这两个其实不是一摸一样的,打开控制台可以看到vm._data里面还有一堆东西,就是因为data在传入给vm._data之前,还要进行一些处理。

加工一下就能做响应式了(数据变了页面也跟着变),vm._data里面还有name.get/address.get和name.set等等函数

我们用原生js写也可以大概模拟一下name和address的getter和setter但是vue做的事情要更多,比如直接输入vue.name就可以查看,js还要vue._data.name

而且如果data里面数据套娃的话vue是自动递归嵌套有getter和setter的,js就没有了,vue连嵌套的数组也能给你挖出来配套getter和setter。

三、Vue监测对象中的数据

1.Vue.set()

实现后添加的数据也能有响应式的功能调用Vue给的API:

Vue.set(vm.student,'sex','男');

vm.$set(vm.student,'sex','男');

实现点击按钮添加性别

<div id="root">
      <h2>学校名称:{{name}}</h2>
      <h2>学校地址:{{address}}</h2>
      <hr/>
      <button @click="addSex">点我添加性别</button>
      <h2>学生姓名:{{student.name}}</h2>
      <h2 v-if="student.sex">学生性别:{{student.sex}}</h2>
      <!-- 判断一下有没有性别,有就展示没有就隐藏 -->
      <h2>学生真实年龄:{{student.age.rAge}},对外年龄:{{student.age.lAge}}</h2>
       <h2>
           <ul>
               <li v-for="(f,index) in student.friends" :key="index">
               {{f.name}}--{{f.age}}
            </li>
           </ul>
       </h2>
    </div>
    <script type="text/javascript">
    
    const vm=new Vue({
        el:'#root',
        data:{
          name:'尚硅谷',
          address:'北京',
          student:{
              name:'tom',
              age:{
                  rAge:40,
                  lAge:18
              },
              friends:[
                  {name:'jerry',age:35}
              ]
          }
        },
        methods: {
            addSex(){
                Vue.set(this.student,'sex','男')
            }
        },
        
     
    })

set的局限性:最开始我们在student里面没有加sex但是盒子上面引用了没有报错,是因为a.b,只要data里有a就不会报错,如果我们再想添加一个校长是不可以给data里面追加属性的,第一个参数不可以是data或者vm。

四、Vue监测数组中的数据

数组中的数据不能靠setter和getter取得和改变数据,在Vue修改数组中的某个元素实现响应式的方法:

1.使用这些API:

push:在最后一个位置添加元素

pop:删除最后一个元素

shift:删除第一个

unshift:往前边加一个

splice:在指定位置插入一个元素

sort:分类

reverse:反转这个数组

filter不算,因为它都不能改变原数组,可以筛选完之后再赋值到之前的数组

所以我们就知道一当中的问题是为什么了,我们对数组的索引值直接去赋值肯定不行

vue当中的数组调用push方法和原始的数组调用push不一样,它是先像原始数组那样调,然后去重新解析模版,生成虚拟dom等等

2.Vue.set() 或 vm.$set()

Vue.set(vm.student.hobby,1,'跳舞')

五、综合大练习

 <div id="root">
      <hr/>
      <h1>学生信息</h1>
      <button @click="student.age++">年龄+1</button>
      <button @click="addSex">添加性别属性,默认值为男</button>
      <button @click="addFriend">在列表首页添加一个朋友</button>
      <button @click="xiugai">修改第一个朋友的名字为张三</button>
      <button @click="addHobby">添加一个爱好</button>
      <button @click="xiugaiaihao">修改第一个爱好为开车</button>
      <h2>学生姓名:{{student.name}}</h2>
      <h2 v-if="student.sex">学生性别:{{student.sex}}</h2>
      <h2>学生真实年龄:{{student.age}}</h2>
       <h2>
           <ul>朋友
               <li v-for="(f,index) in student.friends" :key="index">
               {{f.name}}--{{f.age}}
            </li>
           </ul>
           <ul>爱好
            <li v-for="(h,index) in student.hobby" :key="index">
            {{h}}
         </li>
        </ul>
       </h2>
    </div>
    <script type="text/javascript">
    
    const vm=new Vue({
        el:'#root',
        data:{
          student:{
              name:'tom',
              age:18,
              hobby:['抽烟','喝酒','打麻将'],
              friends:[
                  {name:'jerry',age:35},
                  {name:'tony',age:40}
              ]
          }
        },
        methods: {
            addSex(){
                Vue.set(this.student,'sex','男')
            },
            addFriend(){
                this.student.friends.unshift({name:'tt',age:18})
            },
            xiugai(){
                //this.student.friends[0].name.splice(0,1,'张三')
                this.student.friends[0].name='张三'
            },
            addHobby(){
                this.student.hobby.unshift('唱歌')
            },
            xiugaiaihao(){
                this.student.hobby.splice(0,1,'开车')
            }
        },
        
     
    })

    </script>

我做的时候修改第一个朋友的名字为张三的出了点问题,我光记着不能直接赋值了,但是像这种给数组下的某一个去赋值是可以的,不可以的是不能数组那一条直接赋值frined[0]={,,}这种

说的是0这一项的setter 和getter没有,0本身是对象,下面的name是一个属性,有属性就有setter 和getter。

不能通过数组的索引值直接赋值!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

操作系统笔记之进程调用API中的getpid、fork、wait、exec补充

操作系统笔记之进程调用API中的getpid、fork、wait、exec补充 code review! —— 杭州 2024-03-17 夜 文章目录 操作系统笔记之进程调用API中的getpid、fork、wait、exec补充1.getpid()2.fork()3.wait()4.exec()5.通常&#xff0c;exec() 调用与 fork() 调用一起使用&#xff…

CentOS 7 编译安装 Git

CentOS 7 编译安装 Git 背景来源删除旧版本 Git安装依赖包下载 Git 源代码检验相关依赖&#xff0c;设置安装路径编译安装添加 Git 环境变量重新加载配置文件查看版本号参考文献 背景来源 为什么要安装新版本呢&#xff1f; 因为无聊&#xff0c;哈哈哈&#xff0c;其实也不是…

论文阅读——SpectralGPT

SpectralGPT: Spectral Foundation Model SpectralGPT的通用RS基础模型&#xff0c;该模型专门用于使用新型3D生成预训练Transformer&#xff08;GPT&#xff09;处理光谱RS图像。 重建损失由两个部分组成&#xff1a;令牌到令牌和频谱到频谱 下游任务&#xff1a;

DevOps 环境预测测试中的机器学习

在当今快节奏的技术世界中&#xff0c;DevOps 已成为软件开发不可或缺的一部分。它强调协作、自动化、持续集成&#xff08;CI&#xff09;和持续交付&#xff08;CD&#xff09;&#xff0c;以提高软件部署的速度和质量。预测测试是这一领域的关键组成部分&#xff0c;其中机器…

基于深度学习LSTM+NLP情感分析电影数据爬虫可视化分析推荐系统(深度学习LSTM+机器学习双推荐算法+scrapy爬虫+NLP情感分析+数据分析可视化)

文章目录 基于深度学习LSTMNLP情感分析电影数据爬虫可视化分析推荐系统&#xff08;深度学习LSTM机器学习双推荐算法scrapy爬虫NLP情感分析数据分析可视化&#xff09;项目概述深度学习长短时记忆网络&#xff08;Long Short-Term Memory&#xff0c;LSTM&#xff09;机器学习协…

【解读】保障软件供应链安全:SBOM推荐实践指南(含指南获取链接)

2023年11底&#xff0c;美国NSA&#xff08;National Security Agency&#xff09;、CISA&#xff08;Cybersecurity and Infrastructure Security Agency&#xff09;等多个政府机构部门组成的ESF&#xff08;Enduring Security Framework&#xff0c;持久安全框架&#xff09…

C++ 特殊类及单例模式

文章目录 1. 前言2. 不能被拷贝的类3. 不能被继承的类4. 只能在堆上创建对象的类5. 只能在栈上创建对象的类6. 只能创建一个对象的类&#xff08;单例模式&#xff09; 1. 前言 在实际场景中&#xff0c;我们在编写类的过程中总会遇到一些特殊情况&#xff0c;比如设计一个类不…

06.共享内存

1.内存映射&#xff08;mmap&#xff09; 我们在单片机中首先接触到了映射的概念 将一个寄存器的地址映射到了另外的一个存储空间中 内存映射: 内存映射&#xff08;Memory Mapping&#xff09;是一种在计算机科学中使用的技术&#xff0c;它允许将文件或其他设备的内容映射…

Vue项目的搭建

Node.js 下载 Node.js — Download (nodejs.org)https://nodejs.org/en/download/ 安装 测试 winR->cmd执行 node -v配置 在安装目录下创建两个子文件夹node_cache和node_global,我的就是 D:\nodejs\node_cache D:\nodejs\node_global 在node_global文件下再创建一个…

【SQL】1174. 即时食物配送 II (窗口函数row_number; group by写法;对比;定位错因)

前述 推荐学习&#xff1a; 通俗易懂的学会&#xff1a;SQL窗口函数 题目描述 leetcode题目&#xff1a;1174. 即时食物配送 II 写法一&#xff1a;窗口函数 分组排序&#xff08;以customer_id 分组&#xff0c;按照order_date 排序&#xff09;&#xff0c;窗口函数应用。…

kubernetes-有状态和无状态服务

kubernetes-有状态和无状态服务 kubernetes-有状态和无状态服务1.有状态的应用1.1、理解1.2、特点 2、无状态应用2.1、理解2.2、特点 3、玩一下3.1、启动一个nginx无状态的业务3.2、启动一个nginx有状态的业务 4、无头服务4.1、无头服务的特点&#xff1a;4.2、无头服务的用途&…

力扣每日一题 最小高度树 BFS 双向

Problem: 310. 最小高度树 思路 &#x1f468;‍&#x1f3eb; 参考地址 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( n ) O(n) O(n) Code import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Queue;publ…

企业数据流动安全管理软件(深度解析文章)

企业数据重要性不言而喻&#xff0c;而同时数据的流动和共享也带来了安全风险&#xff0c;如何确保企业数据在流动过程中的安全性&#xff0c;也成为了企业需要面临的重要问题。 企业数据流动安全管理软件的主要功能是监控和管理企业数据的流动过程。 它能够对企业内部的数据…

Ps:直接选择工具

直接选择工具 Direct Selection Tool可用于选择和调整路径或形状中的锚点和路径线段。 快捷键&#xff1a;A 直接选择工具的指针形状为白箭头。当需要调整锚点、方向调杆、路径线段以及对选中的多个锚点子路径进行移动、变换&#xff08;缩放、旋转、扭曲、斜切、变形等&#x…

蓝桥杯刷题(十)

1.翻转 代码 输入数据&#xff0c;每组数据进行比较&#xff0c;j的范围掐头去尾&#xff0c;若a[j]b[j]&#xff0c;继续&#xff0c;若出现010,101子串则改成000,111&#xff0c;遍历完后比较a是否等于b&#xff0c;相同则输出次数&#xff0c;不同则输出-1。 for _ in ran…

智慧城市新篇章:数字孪生的力量与未来

随着信息技术的迅猛发展和数字化浪潮的推进&#xff0c;智慧城市作为现代城市发展的新模式&#xff0c;正在逐步改变我们的生活方式和社会结构。在智慧城市的构建中&#xff0c;数字孪生技术以其独特的优势&#xff0c;为城市的规划、管理、服务等方面带来了革命性的变革。本文…

目标检测---IOU计算详细解读(IoU、GIoU、DIoU、CIoU、EIOU、Focal-EIOU、WIOU)

常见IoU解读与代码实现 一、✒️IoU&#xff08;Intersection over Union&#xff09;1.1 &#x1f525;IoU原理☀️ 优点⚡️缺点 1.2 &#x1f525;IoU计算1.3 &#x1f4cc;IoU代码实现 二、✒️GIoU&#xff08;Generalized IoU&#xff09;2.1 GIoU原理☀️优点⚡️缺点 2…

【Spark编程基础】RDD 编程初级实践(附源代码)

目录 一、实验目的二、实验平台三、实验内容1.spark-shell 交互式编程2.编写独立应用程序实现数据去重3.编写独立应用程序实现求平均值问题 一、实验目的 1、熟悉 Spark 的 RDD 基本操作及键值对操作&#xff1b; 2、熟悉使用 RDD 编程解决实际具体问题的方法 二、实验平台 …

百科源码生活资讯百科门户类网站百科知识,生活常识

百科源码生活资讯百科门户类网站百科知识,生活常识 百科源码安装环境 支持php5.6&#xff0c;数据库mysql即可&#xff0c;需要有子目录权限&#xff0c;没有权限的话无法安装 百科源码可以创建百科内容&#xff0c;创建活动内容。 包含用户注册&#xff0c;词条创建&#xff…

VScode(8)之阅读大型CC++工程

VScode(8)之阅读大型CC工程(Linux内核)代码 Author&#xff1a;Once Day Date&#xff1a;2023年4月25日/2024年3月17日 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章请查看专栏: VScode开发_Once-Day的博客-CSDN博客 参考文档: 1. 历史包袱 由于上世纪70-80年代的…