当前位置: 首页 > news >正文

【前端基础知识】Vue中的变量不是响应式的吗?属性赋值后视图不变化的原因是什么?

在这里插入图片描述

目录

  • 🤔问题
  • 📝回答
  • 🎨使用场景
      • 动态添加属性
      • 动态添加数组元素
  • ❌注意事项
      • $set只能在响应式对象上使用
      • $set不能用于根级别的属性
      • $set的性能问题
  • 📄总结

🤔问题

Vue是一款在国内非常流行的框架,采用MVVM架构,它提供了一种响应式的数据双向绑定机制,使得开发者可以更方便地管理模型和视图。但是在Vue2中,由于使用了Object.defineProperty来追踪属性变化,但是它只能追踪已经存在的属性,无法追踪动态添加的属性,导致我们动态添加了属性后视图也无法更新。这个时候就需要$set的帮助了。

注:Vue3使用的是Proxy去监听属性变化,所以不会有这个问题。但是为了保持向后兼容性,Vue3仍然保留了这个方法,可以使用,但已经不是必需的!

📝回答

$set是Vue提供的一个全局方法,它的作用是在响应式对象上添加一个属性,并确保这个属性是响应式的。这意味着,当这个属性的值发生变化时,Vue会自动更新视图。

$set方法的语法如下:

/**object*///this
this.$set(object, propertyName, value)//vue
Vue.set(object, propertyName, value)
/**Array*///this
this.$set(array, index, value)//vue
Vue.set(array, index, value)

其中,object是要添加属性的对象,propertyName是要添加的属性名,value是要添加的属性值。

举个🌰栗子,假设我们有一个data对象:

data: {user: {name: '张三',age: 18}
}

如果我们想要添加一个新的属性gender,我们可以使用$set方法:

Vue.set(this.user, 'gender', '男')

这样,我们就成功地向user对象中添加了一个gender属性,Vue也会自动更新视图。

🎨使用场景

需要注意的是,$set方法不仅可以用于添加或修改对象属性,而且可以用于数组,并且数组可以使用Vue提供的变异方法,如push、pop、splice等。

动态添加属性

在Vue中,如果我们想要动态地添加一个属性,我们通常会使用以下方式:

this.obj.newProp = 'new value';

但是,这种方式会导致新添加的属性不是响应式的,也就是说,当这个属性的值发生变化时,视图不会自动更新。这时,我们就需要使用$set方法来确保新添加的属性是响应式的:

this.$set(this.obj, 'newProp', 'new value');

这样,当newProp的值发生变化时,视图会自动更新。

动态添加数组元素

在Vue中,如果我们想要动态地添加一个数组元素,我们通常会使用以下方式:

this.arr.push('new item');

我们也可以使用$set方法来确保新添加的元素是响应式的:

this.$set(this.arr, this.arr.length, 'new item');

这样,当新元素被添加到数组中时,视图会自动更新。

❌注意事项

虽然$set方法可以解决动态添加属性和数组元素的问题,但是我们需要注意以下几点:

$set只能在响应式对象上使用

$set方法只能在响应式对象上使用,如果我们在非响应式对象上使用$set方法,它将不起作用。

$set不能用于根级别的属性

$set方法不能用于根级别的属性,也就是说,我们不能使用$set方法来添加或修改组件的根级别属性。如果我们需要修改根级别属性,我们应该在组件的data选项中声明这些属性。

$set的性能问题

$set方法会对性能产生一定的影响,因为它需要遍历整个对象来确保新添加的属性是响应式的。因此,我们应该尽量避免频繁地使用$set方法。

📄总结

$set方法是Vue提供的一个全局方法,它的作用是在响应式对象上添加一个属性,并确保这个属性是响应式的。$set方法的使用场景包括动态添加属性和数组元素。但是,我们需要注意$set方法只能在响应式对象上使用,不能用于根级别的属性,并且会对性能产生一定的影响。

http://www.lryc.cn/news/63953.html

相关文章:

  • 如何完全卸载linux下通过rpm安装的mysql
  • [渗透教程]-004-长城防火墙GFW的原理
  • LaTeX基础文本排版命令
  • PLC模糊控制模糊PID(梯形图实现+算法分析)
  • 线程池在Java多线程中的应用
  • 1997-2021年全国30省技术市场成交额(亿元)
  • 【C++】面向对象之多态
  • 卡尔曼滤波器简介——多维卡尔曼滤波
  • 如何用 GPT-4 帮你写游戏?
  • R语言的贝叶斯时空数据模型实践技术应用
  • Lazysysadmin靶机渗透过程
  • 为什么网络安全缺口很大,招聘却很少?
  • SpringBoot手册
  • 【Linux】如何实现单机版QQ,来看进程间通信之管道
  • 从一到无穷大 #6 盘满排查过程
  • ChatGPT技术原理 第九章:数据集和训练技巧
  • NCR被攻击后服务中断!原是BlackCat勒索软件作祟
  • 带你认识什么是BMS(电池管理系统)
  • 安装Ubuntu22.04虚拟机的一些常见问题解决方法
  • 银河麒麟操作系统,安装Gitlab 基于docker
  • 基于Python实现个人手机定位分析
  • Unity Navgation系统杂记
  • [2021.11.9]lighteffect架构优化详细设计文档
  • 经典回归算法
  • Python两三行代码轻松批量添加~防韩还是很有必要的~
  • 开心消消乐
  • 有效日志管理在软件开发和运营中的作用
  • 【五一创作】【笔记】Git|如何将仓库中所有的 commit 合成一个?又名,如何清除所有 git 提交记录?(附 git rebase 机制的简要分析)
  • 如何写出高质量代码?
  • 外卖项目优化-01-redis缓存短信验证码、菜品数据、Spring Cache(注解开发缓存)、(注解开发)缓存套餐数据