this.$set的正确使用

news2024/11/25 13:43:31

this.#set(obj, key, value)

我们在项目开发的过程中,经常会遇到这种情况:为data中的某一个对象添加一个属性

<template>
  <div class="hello">
    <button @click="setMessage">添加属性</button>
    {{ student.name }}
    <input type="text" v-model="student.age">
  </div>
</template>
<script>
export default {
  data() {
    return {
      student: {
        name: '张三',
      }
    }
  },
  methods: {
    setMessage() {
      this.student.age = 15
      console.log(this.student)
    }
  }
}
</script>

当我们点击按钮,为student添加一个age属性,看看视图层是否能够更新

在这里插入图片描述

 

在这里我们发现虽然这个对象身上已经有了该属性,但是视图层并没有更新该数据,是什么造成的呢?由于受JavaScript的限制,vue.js不能监听对象属性的添加和删除,因为在vue组件初始化的过程中,会调用getter和setter方法,所以该属性必须是存在在data中,视图层才会响应该数据的变化

那么,我们该如何解决这个问题呢
解决这个问题的方法大体有两种:使用this.$set(obj, key, value)/vue.set(obj, key, value)

调用方法:this.$set( target, key, value )
target:要更改的数据源(可以是对象或者数组)   // 表示数据源,即是你要操作的数组或者对象
key:要更改的具体数据  //要操作的的字段
value :重新赋的值  //更改的数据

小案例:

给一个对象添加一个年龄属性并且让它可以响应式的进行改变

<template>
  <div class="text">
      <p>{{list}}</p>
      <button @click="add">age++</button>
  </div>
</template>
<script>
export default {
    data(){
        return {
            list:{ name: "张三"}
        }
    },
    methods: {
        add(){
            if(!this.list.age){ // 如果没有age属性就给它添加一个age属性
                this.list.age=18
            }else{
                this.list.age++
            }
            console.log(this.list)
        }
    }
}
</script>

当我们没有使用this.$set去添加对象属性的时候,效果:

数据确实已经添加进去了,但是页面并没有响应式的渲染age属性。

当我们使用this.$set(this.list,‘age',18)去添加一个属性之后。效果:

我们能看见添加的数据是响应式的。

为什么能够响应式?

仔细观察一下,使用了this.$set 多了get age和set age方法,这正是能够响应式的原因

分析

Vue的响应式原理为 JavaScript 对象传入 Vue 实例作为 data 选项,Vue 将遍历此对象所有的 property,并使用 Object.defineProperty 把这些 property 全部转为 getter/setter。这些 getter/setter 对用户来说是不可见的,但是在内部它们让 Vue 能够追踪依赖,在 property 被访问和修改时通知变更。这里需要注意的是不同浏览器在控制台打印数据对象时对 getter/setter 的格式化并不同,下图来自官方文档。

通过Object.assign(target, sources)方法

<script>
export default {
  data() {
    return {
      student: {
        name: '张三',
      }
    }
  },
  methods: {
    setMessage() {
      this.student.age = 15
      this.student = Object.assign({}, this.student)
      console.log(this.student)
    }
  }
}
</script>

我们发现,通过这两种方式为对象添加属性之后,他的对象身上多了get和set方法,所以,此时我们再次操作该属性的时候,就会引起视图的更新啦
在这里插入图片描述

 

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

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

相关文章

开发IM(即时通讯)服务端

首先讲讲IM&#xff08;即时通讯&#xff09;技术可以用来做什么&#xff1a;可以说几乎所有高实时性的应用场景都需要用到IM技术。 本篇将带大家从零开始搭建一个轻量级的IM服务端&#xff0c;麻雀虽小&#xff0c;五脏俱全&#xff0c;我们搭建的IM服务端实现以下功能&#x…

gpt.4.0-gpt 国内版

gpt 使用 GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一种预训练的语言模型&#xff0c;可用于多种自然语言处理任务&#xff0c;如情感分析、文本分类、文本生成等。下面是使用GPT的一些步骤和建议&#xff1a; 确定任务和数据集&#xff1a;首先&…

选择美国虚拟主机需注意的安全问题

在选择美国虚拟主机时&#xff0c;安全性应该是您首要关注的问题。虚拟主机通常是网站托管的最便宜和最方便的方式之一&#xff0c;但也存在安全问题。在本文中&#xff0c;我们将讨论一些您应该注意的安全问题&#xff0c;并提供一些解决方案来保护您的网站。 一、了解虚拟主机…

Linux 配置与磁盘管理

目录 物理设备的命名规则Linux中硬盘分区部分Linux在分区上建立文件系统挂载Linux硬盘管理工具LVM逻辑卷管理器物理卷、卷组合逻辑卷的建立 逻辑卷的使用LVM整体创建流程硬盘配额配置&#xff08;针对用户或者群组使用的空间&#xff09; 物理设备的命名规则 Linux系统内核中的…

分析trace 知识点分析的很全面

Total time breakdown&#xff1a;依据关键tag拆分&#xff0c;比如binderapplication/activitystart/doframe 找出时间差异大tag的cpu status &#xff1a;Running/Runnable/Sleeping/Uninterruptible sleep Running:SW-diff-check 或 cpu能力(大小核或频率&#xff09; Runna…

v-for比v-if优先级更高?面试官:回去等通知吧

大厂面试题分享 面试题库 前后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 web前端面试题库 VS java后端面试题库大全 前言 v-if和v-for哪个优先级更高呢&#xff1f;这是面试官常常问到的一个问题&#xff0c;…

七、vue-基础之条件渲染

一、条件渲染 在某些情况下&#xff0c;我们需要根据当前的条件决定某些元素或者组件是否渲染&#xff0c;这个时候我们就需要进行条件判断了。 Vue提供了下面的指令来进行条件判断&#xff1a; v-ifv-elsev-else-ifv-show &#xff08;1&#xff09;需求demo体验 我们直接…

Win11的两个实用技巧系列之内存不足导致永劫无间闪退解决方法、Win11本地安全机构保护误报修复方法

Win11内存不足导致永劫无间闪退解决方法 Win11内存不足导致永劫无间闪退怎么办&#xff1f;其实解决方法很简单&#xff0c;本文就为大家带来了详细的解决方法&#xff0c;感兴趣的朋友一起看看吧 Win11内存不足导致永劫无间闪退怎么办&#xff1f;永劫无间出现闪退的情况可能…

python练手小案例——采集二手车数据

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 本次案例亮点: 1、系统分析目标网页 2、html标签数据解析方法 3、海量数据一键保存 环境介绍: 在开始写我们的代码之前&#xff0c;我们要准备好运行代码的程序 Python 3.8.8 | Anaconda, Inc. &#xff1a;解释器 Pych…

物联网|ARM|Keil安装|MDK|增加V5编译器|物联网开发系列课程之零基础玩转Cortex-M系列CPU-学习笔记(1)

文章目录 第一阶段-课程背景及简介问题一 什么是物联网问题二 嵌入式系统在物联网中的角色问题三 不一样的嵌入式系统 课程介绍课程内容提要&#xff08;学什么)课程特色课程要求&#xff08;怎么学)课程目的(怎么用)课程约定 浅谈ARM什么是ARMARM体系架构CPU的特点ARM体系架构…

04-24 每日一题 1163. 按字典序排在最后的子串 学习笔记反思

不晓得脑袋的灵活性是不是和精力的充沛程度相关&#xff0c;看到红色的困难&#xff0c;感觉自信都没了 题目描述 给你一个字符串 s &#xff0c;找出它的所有子串并按字典序排列&#xff0c;返回排在最后的那个子串 示例 1 :::success 输入&#xff1a;s “abab” 输出&…

【CocosCreator入门】CocosCreator组件 | Button(按钮)组件

Cocos Creator 是一款流行的游戏开发引擎&#xff0c;具有丰富的组件和工具&#xff0c;其中的Button组件可以通过设置按钮的状态和点击事件&#xff0c;实现在游戏中添加按钮交互的功能。 目录 一、组件介绍 二、组件属性 三、点击事件 Ⅰ、通过属性检查器添加回调 Ⅱ、通…

【AI话题】Chatbot UI下实现的对话模拟机

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 项目初衷&#xff1a;一、功能介绍&#xff1a;二、使用说明&#xff1a;1.注意事项&#xff1a; 三&#xff0c;未来功能&#xff1a;总结 项目初衷&#xff1a; …

让人悲观的国内ChatGPT的未来

最近关于ChatGPT的火爆已经不是简单的AI圈的事了&#xff0c;它已经席卷了所有的IT、媒体圈子&#xff0c;甚至是不同领域不同行业的人&#xff0c;只要你还对于变化与AI有一定的了解&#xff0c;那我相信你一定能知道ChatGPT是什么了。ChatGPT在某种程度上已经是相当于AGI通用…

时间序列的数据分析(七):数据平稳性

之前已经完成了六篇关于时间序列的博客&#xff0c;还没有阅读过的读者请先阅读&#xff1a; 时间序列的数据分析(一):主要成分 时间序列的数据分析(二):数据趋势的计算 时间序列的数据分析(三):经典时间序列分解 时间序列的数据分析(四):STL分解时间序列的数据分析(五):简单…

怎么使用gpt4-在哪里使用gpt

gpt-4怎么用 目前&#xff0c;GPT-4尚未发布或公开释放。因此&#xff0c;我们目前无法使用GPT-4。GPT-4是由OpenAI公司开发的人工智能语言模型&#xff0c;其预计能够比先前的版本GPT-3更加强大和智能化&#xff0c;但我们需要等待OpenAI官方发布有关GPT-4的更多信息。 如果…

搜索引擎找外贸客户

说起搜索引擎&#xff0c;我们每个人都不陌生&#xff0c;也许第一时间就能想到平日经常使用的“百度一下”和凭借强大算法及丰富功能占据近85%市场份额的谷歌搜索&#xff08;Statista 2023年1月数据&#xff09;这些耳熟能详的搜索引擎。对于外贸人而言搜索引擎也是非常实用的…

内卷的上海车展上,百度Apollo带来新型开放整零关系

/ 导读 / 汽车的智能化发展已然成为了当前市场最有热度的话题&#xff0c;更有希望引领新一代产业革命的浪潮。百度作为最早探索智能驾驶领域的企业之一&#xff0c;多年来始终打磨技术产品&#xff0c;已经形成了全栈的解决方案&#xff0c;从而帮助企业造好车。 在上海车展前…

谁不看谁是

报错Cannot create property type on string 是因为 你定义的相关变量是字符串 改成这样就行了 vue报错Cannot set properties of undefined (setting ‘xxx‘) 是因为没获取到值&#xff0c;需要在方法外层定义变量等于this&#xff0c;然后在方法内使用变量.name去查找值&a…

项目沟通管理5大技巧 第4个很重要

1、充分使用twitter管理沟通模型 项目沟通会议可以充分使用witter的管理沟通模型&#xff0c;提高会议沟通效率。使用此模型&#xff0c;主要是有三步&#xff1a; 第一步&#xff1a;倾听&#xff0c;项目经理需要保持中立的立场&#xff0c;不先表态&#xff0c;让团队成员畅…