Vue监视数据的学习笔记

news2024/11/16 2:38:09

Vue监测数据变化的更新

    <div id="monitor">
        <h2>人员列表</h2>
        <button @click="updateMei">更新马冬梅信息</button>
        <ul>
            <li v-for="(p,index) of  persons" :key="index">
                {{p.name}}--{{p.age}}--{{p.sex}}
            </li>
        </ul>
    </div>
    <script>
        const vm = new Vue({
            el: '#monitor',
            data: {
                persons: [
                    { id: '001', name: '马冬梅', age: 18, sex: '女' },
                    { id: '002', name: '周冬雨', age: 19, sex: '女' },
                    { id: '003', name: '周杰伦', age: 20, sex: '男' },
                    { id: '004', name: '温兆伦', age: 20, sex: '男' }
                ]
            },
            methods: {
                updateMei() {
                     this.persons[0].name = '马老师',
                         this.persons[0].age = '50',
                         this.persons[0].sex = '男'
                }
            }
        })
    </script>

上面代码可以正常运行,但是当把updateMei改成下面这句就会出现问题。

this.persons[0] = { id: '0011', name: '马老师', age: 50, sex: '男' }

运行截图
在这里插入图片描述

当点击更新按钮的时候,页面的马冬梅不会自动更新(vue监测不到),但是后台输出发现信息已经修改。

data与_data里面的内容不一样,_data里面写了get,set,name发生变化setter就会调用.

Vue.set

用法:向响应式对象中添加一个响应式property,触发试图更新。必须在响应式对象上面添加新的property,因为Vue无法探测普通的新增property
注意对象不能是Vue实例,或者Vue实例的根数据对象(data或_data)

 <div id="root">
        <h2>学校:{{name}}</h2>
        <h2>地址:{{address}}</h2>
        <hr>
        <h2>学生姓名:{{student.name}}</h2>
        <h2>学生性别:{{student.sex}}</h2>
        <h2>学生年龄:真实{{student.age.rAge}},对外{{student.age.sAge}}</h2>
        <!-- <h4>朋友列表{{student.friends.name}}--{{student.friends.age}}</h4>这样写不对 -->
        <ul>
            <li v-for="(f,index) in student.friends" :key="index">
                {{f.name}}--{{f.age}}
            </li>
        </ul>
    </div>

    <script>
        const vm = new Vue({
            el: '#root',
            data: {
                name: 'nepu',
                address: 'daqing',
                student: {
                    name: 'Tom',
                    sex: '男',
                    age: {
                        rAge: 40,
                        sAge: 29,
                    },
                    friends: [
                        { name: 'Lily', age: 30 },
                        { name: 'Doudou', age: 34 }
                    ]
                }
            }
        })
    </script>

如果删除学生的性别,不会报错只是页面上性别那里会空着,控制台设置性别vm._data.student.sex='男’可以在控制台查看到该属性,但是页面没有更新,因为性别没有setter。可以使用Vue.set实现页面更新

 <button @click="addSex">添加一个性别属性,默认值男</button>
            methods: {
                addSex() {
                    // Vue.set(this.student, 'sex', '男')
                    this.$set(this.student, 'sex', '男')
                }
            }

但是Vue.set局限在只可以给data的属性加,不可以给vue实例加。
监测数组对象的改变可以看到student.age里面的属性都有getter和setter。而hobby如果写成数组的形式,不会有属性对应的setter,getter。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

数组里面的数据没有对应的getter和setter,通过对应的索引值修改数据不会改变页面数据的情况,因为vue中的每个数据不是依靠setter和getter进行监视的,array.push()给数组的末尾添加数据,如图,
在这里插入图片描述

hobby数组归vue管理,hobby的push不是array的push。
可以使用vue.set
在这里插入图片描述

在这里插入图片描述

看需求写代码

    <div id="zongjie">
        <h1>学生信息</h1>

        <button>年龄+1岁</button><br />
        <button>添加性别属性,默认值:男</button><br />
        <button>在列表首位添加一个朋友</button><br />
        <button>修改第一个朋友的名字叫张三</button><br />
        <button>添加一个爱好</button><br />
        <button>修改第一个爱好是开车</button>

        <h2>学生姓名:{{student.name}}</h2>
        <h2>学生年龄:{{student.age}}</h2>
        <h3>爱好:</h3>
        <ul>
            <li v-for="(h,index) in student.hobby" :key="index">
                {{h}}
            </li>
        </ul>
        <h3>朋友们</h3>
        <ul>
            <li v-for="(f,index) in student.friends" :key="index">
                {{f.name}}--{{f.age}}
            </li>
        </ul>
    </div>
    <script>
        const vm = new Vue({
            el: '#zongjie',
            data: {
                student: {
                    name: 'tom',
                    age: 18,
                    hobby: ['吃饭', '睡觉', '打豆豆'],
                    friends: [
                        { name: 'Jerry', age: 12 },
                        { name: 'Tony', age: 23 }
                    ]
                }
            }
        })
    </script>
  1. 学生的年龄增加1,直接给button设置click
@click="student.age++"
  1. 添加性别属性,默认是男,所以添加一个响应式的性别,页面也跟着变的.
    给button添加click事件,在methods里面声明setSex方法
<button @click="addSex">

注意methods的位置是写在Vue实例里面,不是data里面。
下面这种写法不是响应式的,可以通过控制台查询点击按钮前后的vm._data.student观察新添加的属性,但是页面不会更新。

 methods: {
     addSex() {
         this.student.sex = '男'
     }
 }

正确应该在页面中添加h3标签,方便页面更新时候数据展示,this.student=vm._data.student,所以也可以是this.$set(this.student, ‘sex’, ‘男’)

methods里面的方法
 addSex() {
     Vue.set(this.student, 'sex', '男')
 }

更完美一点,没有性别的时候隐藏页面中的性别信息

<h2 v-if="student.sex">性别:{{student.sex}}</h2>

额外的需求
修改性别,注意未知是字符串要使用单引号,不然会报错的

      <button @click="student.sex='未知' "></button>
  1. 在列表首位添加一个朋友
<button @click.once="addFriend">在列表首位添加一个朋友</button><br />
 addFriend() {
     this.student.friends.unshift({
         name: 'Jack', age: 70
     })
 }

unshift添加数组的属性是详细的具有get和set
4. 修改第一个朋友的名字叫张三

updateFirstFriendName() {
    this.student.friends[0].name = '张三'
}
  1. 添加一个爱好
 addHobby() {
     this.student.hobby.push('学习')
 },
  1. 修改第一个爱好是开车
    不可以通过数组索引值直接赋值,即不能 this.student.hobby[0] = ‘开车’
    updateHobby() {
        // this.student.hobby.splice(0,1,'开车') 
        Vue.set(this.student.hobby, 0, '开车')
    }

  1. 过滤爱好中的打豆豆<button @click=“removePlay”>过滤爱好中的打豆豆
removePlay() {
     this.student.hobby = this.student.hobby.filter((h) => {
         return h !== '打豆豆'
     })
}

Vue监视数据总结

  1. Vue会监视data中所有层次的数据

  2. 如何监测对象中的数据
    通过setter实现监视,且要在new Vue时就要传入要监测的数据
    (1). 对象中后追加的属性,Vue默认不做响应式处理
    (2). 如需给后添加的属性做响应式,请使用如下API:
    Vue.set(target,propertyName/index,value)或
    vm.$set(target,propertyName/index,value)

  3. 如何监测数组中的数据?
    通过包裹数组更新元素的方法实现,本质两步骤
    (1).调用原生对应的方法对数组进行更新
    (2).重新解析模板,进而更新页面。

  4. 在Vue修改数组中的某个元素一定要用如下方法
    (1)使用API:push(),pop(),shift(),unshift(),splice(),sort(),reverse()
    (2)Vue.set()或vm.$set()

    特别注意:Vue.set()和vm.$set()不能给vm或者vm的根数据对象添加属性!!!

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b93MiqUw-1682235357722)(…/%E7%AC%94%E8%AE%B0/vue.png)]
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-caJ11N7Z-1682235357722)(vue.png)]
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gbCHXyKY-1682235357723)(…/%E7%AC%94%E8%AE%B0/vue.png)]

ft(),splice(),sort(),reverse()
(2)Vue.set()或vm.$set()

特别注意:Vue.set()和vm.$set()不能给vm或者vm的根数据对象添加属性!!!

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

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

相关文章

Python数据结构-----递归实现快速排序

目录 前言&#xff1a; 快速排序 1.概念 2.示例 Python代码实现 递归实现快速排序 前言&#xff1a; 今天我们就来一起学习快速排序的思想方法&#xff0c;然后通过Python语言来实现快速排序的功能&#xff0c;下面我们就开始今天的学习吧&#xff01; 快速排序 1.概念 快…

银行数字化转型导师坚鹏:金融科技在银行数字化转型中的创新案例

金融科技在银行数字化转型中的创新与应用案例&#xff08;偏重对公业务&#xff09; 课程背景&#xff1a; 数字化背景下&#xff0c;很多银行存在以下问题&#xff1a; 不清楚5G如何赋能银行数字化转型&#xff1f; 不清楚最新金融科技创新与应用案例&#xff1f; 不了…

【部署YUM仓库】

目录 一、YUM概述1.1、YUM&#xff08; Yellow dog Upadater Modified) 二、准备安装源2.1、YUM软件仓库类型2.2、RPM软件包的来源2.3、第三方yum源的网址查看:2.4、构建CentOS 7 软件仓库2.4.1、配置yum源仓库时要先挂载2.4.2、配置yum源仓库2.4.3、配置完后更新缓存 2.5、ftp…

AutoSAR内存映射

总目录链接>> AutoSAR入门和实战系列总目录 总目录链接>> AutoSAR BSW高阶配置系列总目录 文章目录 为了防止不必要的内存缺口&#xff08;RAM 中未使用的空间&#xff09;&#xff0c;不同大小&#xff08;8、16 和 32 位&#xff09;的变量根据其大小映射到特…

论文笔记:基于并行注意力 UNet的裂缝检测方法

0 简介 论文&#xff1a;基于并行注意力 UNet的裂缝检测方法&#xff08;Parallel Attention Based UNet for Crack Detection&#xff09;&#xff1b; 发表&#xff1a;2021年发表在《计算机研究与发展》上。 1 问题分析 问题&#xff1a;裂缝图像中存在噪声、光线、阴影等…

中睿天下亮相2022电力行业信息化年会

4月14日-15日&#xff0c;以“低碳数字新动力&#xff0c;电力转型新发展”为主题的2022电力行业信息化年会在长沙成功召开。中睿天下作为网络安全企业受邀出席参展&#xff0c;展示多样性网络安全产品、电力行业解决方案及相关应用成果。 作为能源电力领域的行业盛会和学术交流…

垃圾回收器(一)

垃圾回收器概述 垃圾收集器没有在规范中进行过多的规定&#xff0c;可以由不同的厂商、不同版本的JVM来实现。 由于JDK的版本处于高速迭代过程中&#xff0c;因此Java发展至今已经衍生了众多的GC版本。 从不同角度分析垃圾收集器&#xff0c;可以将GC分为不同的类型。 GC分…

设计模式简谈

设计模式是我们软件架构开发中不可缺失的一部分&#xff0c;通过学习设计模式&#xff0c;我们可以更好理解的代码的结构和层次。 设计原则 设计原则是早于设计方法出现的&#xff0c;所以的设计原则都要依赖于设计方法。这里主要有八个设计原则。 推荐一个零声学院免费教程&…

阳光万里,祝你上岸——免统考在职研究生

什么是在职研究生 在职研究生&#xff0c;是国家计划内&#xff0c;以在职人员身份&#xff0c;部分时间在职工作&#xff0c;部分时间在校学习的研究生教育的一种类型。在职攻读硕士方式有三种&#xff1a; 1.双证非全日制研究生&#xff1a;为普通高等教育研究生学历&#x…

QGIS--开发OpenSCENARIO动态场景(三)--制作动态场景

一、添加scenario&#xff0c;carla的环境变量 export CARLA_ROOT/path/to/your/carla/installation export SCENARIO_RUNNER_ROOT/path/to/your/scenario/runner/installation export PYTHONPATH$PYTHONPATH:${CARLA_ROOT}/PythonAPI/carla/dist/carla-<VERSION>.egg ex…

如何利用工时表来帮助项目管理做得更完善?

项目管理是一项复杂的任务&#xff0c;需要协调各种资源以确保项目按时交付。其中一个关键方面是管理各个员工工时。工时表软件是一种可以帮助企业记录各个员工工作时效的工具&#xff0c;而且还可以帮助项目管理者记录和跟踪项目成员的时间。那么如何利用工时表来帮助项目管理…

如何配置静态路由?这个实例详解交换机的静态路由配置

一、什么是静态路由 静态路由是一种路由的方式&#xff0c;它需要通过手动配置。静态路由与动态路由不同&#xff0c;静态路由是固定的&#xff0c;不会改变。一般来说&#xff0c;静态路由是由网络管理员逐项加入路由表&#xff0c;简单来说&#xff0c;就是需要手动添加的。…

相空间相关概念以及轨迹生成

在时间序列分析中&#xff0c;相位轨迹也被广泛应用于提取隐藏在数据中的结构信息。例如&#xff0c;在人类活动识别任务中&#xff0c;通过构建不同活动对应的相位轨迹&#xff0c;可以揭示活动间的相似性和差异性&#xff0c;从而有助于设计有效的分类方法。 相空间&#xff…

Java每日一练(20230420)

目录 1. 罗马数字转整数 &#x1f31f; 2. 电话号码的字母组合 &#x1f31f;&#x1f31f; 3. 排列序列 &#x1f31f;&#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每…

java基础——Map

Map 第一章 Map集合 1.1 概述 Java提供了专门的集合类用来存放键值对关系的对象&#xff0c;即java.util.Map接口。 我们通过查看Map接口描述&#xff0c;发现Map接口下的集合与Collection接口下的集合&#xff0c;它们存储数据的形式不同&#xff0c;如下图。 Collection中…

Java学习之匿名内部类(非常重要)

目录 一、匿名内部类介绍 基本语法 二、举例说明 1.传统方式实现接口 2.使用匿名内部类进行简化 一、匿名内部类介绍 1.匿名内部类也是类 2.匿名内部类也是内部类 3.匿名内部类没有名字&#xff08;名字存在于JVM中&#xff0c;不会显示出来&#xff09; 4.匿名内部类同时…

Pytorch深度学习笔记(八)处理多维度特征的输入

目录 1.概述 2. 处理多维度特征的输入 注&#xff1a;不同的激活函数&#xff08;sigmoid函数&#xff09;&#xff0c; 绘制不同的图表 推荐课程&#xff1a;07.处理多维特征的输入_哔哩哔哩_bilibili 1.概述 一个八维数据集&#xff1a; 数据集&#xff0c;每一行称为一个…

完整搭建 SpringCloud 项目

目录 1、数据库表结构设计 2、项目结构设计搭建 &#xff08;1&#xff09;创建父工程&#xff08;SpringBoot 类型&#xff09; &#xff08;2&#xff09;其他功能模块搭建 &#xff08;3&#xff09;创建 eureka &#xff08;4&#xff09;创建common 模块 &#xff08;5&…

jmeter常用组件1

常用的组件 常用的组件1&#xff0c;配置元件 1.HTTP请求默认值2.HTTP信息头管理器3.HTTP Cookie管理器4.用户自定义变量5.csv数据导入 2&#xff0c;集合点3&#xff0c;后置处理器 1.debug处理器2.json提取器 本文永久更新地址: 1&#xff0c;配置元件 1.HTTP请求默认值 在…

ASP.NET Core MVC 从入门到精通之Razor语法

随着技术的发展&#xff0c;ASP.NET Core MVC也推出了好长时间&#xff0c;经过不断的版本更新迭代&#xff0c;已经越来越完善&#xff0c;本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容&#xff0c;适用于初学者&#xff0c;在校毕业生&#xff0c…