Vue 中的 Vue.set 和 this.$set 的区别
在 Vue 中,当我们需要动态地添加或修改对象或数组中的某一项时,我们通常会使用 Vue.set
或 this.$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.set
和 this.$set
的作用相同,都可以用于动态地添加或修改对象或数组中的某一项。但它们的使用方式和内部实现方式有所不同。
1. 使用方式
Vue.set
是全局方法,可以在任何地方使用;this.$set
是 Vue 实例提供的方法,只能在 Vue 实例中使用。
2. 内部实现
Vue.set
和 this.$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.set
或 this.$set
方法时,需要注意以下几点:
- 只能用于对象或数组,不能用于基本数据类型(如字符串、数字、布尔值等)。
- 修改数组的某一项时,需要确保索引值在合法范围内,否则会引发异常。
- 在使用 this.$set 方法时,需要确保该方法在 Vue 实例中使用,否则会引发异常。
- 在使用 Vue.set 或 this.$set 方法时,需要确保目标对象已经被 Vue 实例观察,否则无法实现响应式更新。如果目标对象没有被观察,可以使用 Vue.observable 方法将其转换为响应式对象。
- 在使用 Vue.set 或 this.$set 方法时,需要注意性能问题。由于这两个方法会触发 Vue 的响应式更新机制,因此在频繁修改对象或数组时可能会导致性能瓶颈。为了避免这种情况,可以尝试使用批量更新或异步更新的方式,或者在不需要响应式更新时使用原生的 JavaScript 方法进行修改。
总结
Vue.set
和 this.$set
是 Vue 中用于动态添加或修改对象或数组中的某一项的方法,它们的作用相同,但使用方式和内部实现方式有所不同。在使用这两个方法时,需要注意目标对象已经被 Vue 实例观察、不要使用在基本数据类型上、修改数组的索引需要确保在合法范围内、注意性能问题等注意事项。只有在正确使用这两个方法的前提下,才能充分发挥 Vue 的响应式更新机制的优势,提高开发效率和代码质量。
相关文章
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监听一个对象时,如何排除某些属性的监听
发布时间:2023/03/31 浏览次数:858 分类:Vue
-
在 Vue 中使用 watch 时,你可能需要监听一个对象,但只关心对象中的某些属性,而不是对象的所有属性。这种情况下,你可以使用深度监听和计算属性,或者在 watch 中添加一些选项来排
在 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 中,页面的更新通常是通过数据绑定和响应式系统来实现的。但是有时候需要手动刷新页面