迹忆客 专注技术分享

当前位置:主页 > 学无止境 > WEB前端 > Vue >

Vue 中的 Vue.set 和 this.$set 的区别

作者:迹忆客 最近更新:2023/05/09 浏览次数:

在 Vue 中,当我们需要动态地添加或修改对象或数组中的某一项时,我们通常会使用 Vue.setthis.$set 方法。虽然这两个方法的作用相同,但它们的使用方式和内部实现方式有所不同。


Vue.set

Vue.set 是 Vue.js 提供的全局方法,可以在任何地方使用。它的使用方式如下:

Vue.set(target, key, value)

其中,target 表示要添加或修改的对象或数组,key 表示要添加或修改的属性名或索引值,value 表示要添加或修改的属性值。

例如,我们有一个 data 对象:

data: {
  list: ['a', 'b', 'c']
}

如果我们想要将 list 数组的第一个元素修改为 ‘d’,可以使用 Vue.set 方法:

Vue.set(this.data.list, 0, 'd')

这样就可以将 list 数组的第一个元素修改为 ‘d’。

需要注意的是,Vue.set 方法只能用于对象或数组,不能用于基本数据类型(如字符串、数字、布尔值等)。


this.$set

this.$set 是 Vue 实例提供的方法,只能在 Vue 实例中使用。它的使用方式如下:

this.$set(target, key, value)

其中,target 和 key 的含义与 Vue.set 方法相同,value 表示要添加或修改的属性值。

例如,我们有一个组件:

export default {
  data() {
    return {
      list: ['a', 'b', 'c']
    }
  },
  methods: {
    changeList() {
      this.$set(this.list, 0, 'd')
    }
  }
}

如果我们想要将 list 数组的第一个元素修改为 ‘d’,可以使用 this.$set 方法。

需要注意的是,this.$set 方法只能用于对象或数组,不能用于基本数据类型(如字符串、数字、布尔值等)。


Vue.set 和 this.$set 的区别

Vue.setthis.$set 的作用相同,都可以用于动态地添加或修改对象或数组中的某一项。但它们的使用方式和内部实现方式有所不同。

1. 使用方式

Vue.set 是全局方法,可以在任何地方使用;this.$set 是 Vue 实例提供的方法,只能在 Vue 实例中使用。

2. 内部实现

Vue.setthis.$set 的内部实现方式略有不同。Vue.set 方法的实现方式如下:

Vue.set = function(obj, key, val) {
  if (Array.isArray(obj) && isValidArrayIndex(key)) {
    obj.length = Math.max(obj.length, key)
    obj.splice(key, 1, val)
    return val
  }
  if (hasOwn(obj, key)) {
    obj[key] = val
    return val
  }
  const ob = obj.__ob__
  if (!ob) {
    obj[key] = val
    return val
  }
  defineReactive(ob.value, key, val)
  ob.dep.notify()
  return val
}

this.$set 方法的实现方式如下:

export function set(target: Array<any> | Object, key: any, val: any): any {
  if (process.env.NODE_ENV !== 'production' &&
    (isUndef(target) || isPrimitive(target))
  ) {
    warn(`Cannot set reactive property on undefined, null, or primitive value: ${(target: any)}`)
  }
  if (Array.isArray(target) && isValidArrayIndex(key)) {
    target.length = Math.max(target.length, key)
    target.splice(key, 1, val)
    return val
  }
  if (key in target && !(key in Object.prototype)) {
    target[key] = val
    return val
  }
  const ob = (target: any).__ob__
  if (target._isVue || (ob && ob.vmCount)) {
    process.env.NODE_ENV !== 'production' && warn(
      'Avoid adding reactive properties to a Vue instance or its root $data ' +
      'at runtime - declare it upfront in the data option.'
    )
    return val
  }
  if (!ob) {
    target[key] = val
    return val
  }
  defineReactive(ob.value, key, val)
  ob.dep.notify()
  return val
}

可以看到,this.$set 方法在实现方式上多了一些边界检查和警告提示,以增加代码的健壮性和可读性。


注意事项

在使用 Vue.setthis.$set 方法时,需要注意以下几点:

  1. 只能用于对象或数组,不能用于基本数据类型(如字符串、数字、布尔值等)。
  2. 修改数组的某一项时,需要确保索引值在合法范围内,否则会引发异常。
  3. 在使用 this.$set 方法时,需要确保该方法在 Vue 实例中使用,否则会引发异常。
  4. 在使用 Vue.set 或 this.$set 方法时,需要确保目标对象已经被 Vue 实例观察,否则无法实现响应式更新。如果目标对象没有被观察,可以使用 Vue.observable 方法将其转换为响应式对象。
  5. 在使用 Vue.set 或 this.$set 方法时,需要注意性能问题。由于这两个方法会触发 Vue 的响应式更新机制,因此在频繁修改对象或数组时可能会导致性能瓶颈。为了避免这种情况,可以尝试使用批量更新或异步更新的方式,或者在不需要响应式更新时使用原生的 JavaScript 方法进行修改。

总结

Vue.setthis.$set 是 Vue 中用于动态添加或修改对象或数组中的某一项的方法,它们的作用相同,但使用方式和内部实现方式有所不同。在使用这两个方法时,需要注意目标对象已经被 Vue 实例观察、不要使用在基本数据类型上、修改数组的索引需要确保在合法范围内、注意性能问题等注意事项。只有在正确使用这两个方法的前提下,才能充分发挥 Vue 的响应式更新机制的优势,提高开发效率和代码质量。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

Vue - An In-Depth Guide to Lifecycle Hooks

发布时间:2025/02/21 浏览次数:117 分类:Vue

Vue has many lifecycle hooks, and it can be confusing to understand the meaning or purpose of each one. In this article, we will explain the function of each lifecycle hook and how to use them.

Solution for Flickering During Vue Template Parsing

发布时间:2025/02/21 浏览次数:103 分类:Vue

Solution for Flickering During Vue Template Parsing, Recently, while working on a project, I noticed that when the internet speed is slow, the screen flickers and the expression message appears. This happens because when the internet speed i

如何在 Vue.js 中滚动到页面顶部或底部

发布时间:2023/04/03 浏览次数:508 分类:Vue

Vue.js 是一种流行的前端框架,它可以帮助开发者构建高效、可维护的应用程序。在Vue.js中,滚动页面到顶部或底部是一个常见的需求。在本文中,我们将介绍如何在Vue.js中实现这一功能

在 vue 中鼠标悬停时显示元素或文本

发布时间:2023/04/03 浏览次数:415 分类:Vue

Vue.js 是一种流行的 JavaScript 框架,可以使 Web 应用程序的开发变得更加轻松和高效。在这篇教程里,我们将学习如何利用 Vue.js 来在鼠标悬停时显示元素或文本。 本教程将涵盖以下主题

在 Vue 中 watch 的 immediate 属性有什么用?

发布时间:2023/03/31 浏览次数:480 分类:Vue

在Vue中, watch 是一种数据变化时执行异步任务或触发响应式依赖的方式。在大多数情况下,watch 都会被默认延迟执行。这意味着,只有当所监视的值发生变化后,watch才会被触发,并且

在 Vue 中设置复选框功能

发布时间:2023/03/30 浏览次数:384 分类:Vue

在 Vue 中,复选框是一种非常常见的交互组件,它可以让用户选择多个选项。本文将介绍如何在 Vue 中设置复选框功能,并提供一些实际示例。 使用 v-model 指令 Vue 中的 v-model 指令可以实

在 Vue 中如果子组件改变props里的数据会发生什么

发布时间:2023/03/30 浏览次数:453 分类:Vue

在 Vue 中,子组件改变 props 中的数据会导致父组件和其他子组件的响应性发生变化。 首先,需要了解 props 是从父组件向子组件传递数据的一种方式。在组件中定义 props 后,父组件可以

如何在 Vue 中刷新页面

发布时间:2023/03/29 浏览次数:191 分类:Vue

Vue 是一个流行的 JavaScript 框架,它提供了许多便捷的工具和方法来构建 Web 应用程序。在 Vue 中,页面的更新通常是通过数据绑定和响应式系统来实现的。但是有时候需要手动刷新页面

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便