从vue源码解析Vue.set()和this.$set()

Vue 源码解析 Vue.set() 和 this.$set()

在 Vue 中,我们使用 Vue.set()this.$set() 来设置响应式对象的新属性或更新已有属性。这个方法的底层实现原理比较复杂,本文将从源码角度解析其底层实现过程。

Vue.set() 和 this.$set() 概述

在 Vue.js 中,我们可以使用 Vue.set()this.$set() 方法来修改数组或对象上的属性并保证数据响应式。

具体的使用如下:

// 在数组上设置一个新属性
Vue.set(array, indexOfArray, newValue)
this.$set(array, indexOfArray, newValue)

// 在对象上设置一个新属性
Vue.set(object, propertyName, value)
this.$set(object, propertyName, value)

Vue.set() 和 this.$set() 实现

Vue.set()this.$set() 的实现是非常类似的,它们都是通过调用 defineReactive() 方法来实现将对象或数组的属性转为响应式数据。

具体的实现如下:

const ob = this.__ob__
ob.dep.notify()
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 oldVal = target[key]
if (val === oldVal) {
  return val
}
if (!ob) {
  target[key] = val
  return val
}
defineReactive(ob.value, key, val)
ob.dep.notify()
return val

代码中的 ob 是响应式对象的观察者,它通过调用 defineReactive() 方法来将对象或数组的属性转为响应式数据。

Vue.set() 和 this.$set() 示例

下面通过两个例子来演示 Vue.set()this.$set() 的应用场景。

示例一:在数组中新增元素

我们可以使用 Vue.set()this.$set() 方法来在已经定义的数组中新增元素。这种方式确保新添加的元素也是响应式的。

new Vue({
  data: {
    items: ['item1', 'item2', 'item3']
  },
  mounted() {
    // 在数组中添加新元素并确保该元素也是响应式的
    Vue.set(this.items, 3, 'item4')
  }
})

示例二:在对象中新增属性

同样的,我们也可以使用 Vue.set()this.$set() 来在已经定义的对象中新增属性。这种方式同样保证新增的属性也是响应式的。

new Vue({
  data: {
    user: {
      name: 'John Doe',
      age: 30
    }
  },
  mounted() {
    // 在对象中添加新属性并确保该属性也是响应式的
    Vue.set(this.user, 'email', 'johndoe@example.com')
  }
})

以上就是从源码角度分析 Vue.set()this.$set() 方法的实现原理及实际应用示例。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:从vue源码解析Vue.set()和this.$set() - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • Vue实现页面添加水印功能

    下面我来详细讲解一下“Vue实现页面添加水印功能”的完整攻略。 步骤一:安装依赖 首先需要安装一个npm包,名为watermark-dom,这个包可以用来在DOM元素上添加水印。通过以下命令安装: npm install watermark-dom –save 步骤二:创建组件 接下来需要创建一个组件,可以称之为Watermark,表示页面上添加水印的区域…

    Vue 2023年5月28日
    00
  • vue格式化element表格中的时间为指定格式

    当我们使用 Vue 和 Element UI 框架来处理时间数据时,有时候需要将时间数据按照指定的格式进行格式化,这里提供几种解决方案: 1. 使用 Element UI Table 组件中的 scoped slot 在表格中创建一个名为“date”(可以自己命名)的范围插槽,然后将单元格样式修改相应的格式。 <el-table-column labe…

    Vue 2023年5月28日
    00
  • VUE中使用Vue-resource完成交互

    使用Vue-resource完成交互可以实现前端页面和后端服务器之间的数据交换和通信。下面是使用Vue-resource实现交互的完整攻略: 1. 安装Vue-resource 在使用Vue-resource前,首先要将其安装到Vue项目中,可以通过在命令行中执行以下命令进行安装: npm install vue-resource –save 2. 引入V…

    Vue 2023年5月28日
    00
  • vue Watch和Computed的使用总结

    我来为你详细讲解“vue Watch和Computed的使用总结”的完整攻略。 什么是vue Watch和Computed 在Vue.js开发中,数据的状态更新非常频繁,因此需要工具来监听并响应数据变化。Vue Watch和Computed都是解决Vue数据变化监听的两个方案。 Watch是一种对数据进行监听并做出相应的方案,当监听的数据发生变化时,会立即触…

    Vue 2023年5月27日
    00
  • 前端vue+express实现文件的上传下载示例

    我们来详细讲解一下“前端vue+express实现文件的上传下载示例”的完整攻略。 1. 准备工作 首先,我们需要安装node.js和npm,这两个东西是在建立一个web应用程序时必要的要素。安装好这两个以后,我们可以使用npm安装express和vue-cli。 # 安装express npm install express –save # 安装vue-…

    Vue 2023年5月28日
    00
  • vue组件间传值的方法你知道几种

    当我们使用Vue.js框架时,组件和组件间的通信常常需要使用传值方法来完成。下面将介绍Vue组件间传值的多种方法。 Props Props是Vue中一种父子组件传递数据的方式。父组件可以通过标签属性的形式把数据传递给子组件,子组件通过props来接收这些数据。 例如,父组件中这样写: <template> <div> <chil…

    Vue 2023年5月28日
    00
  • vue计时器的实现方法

    下面是关于vue计时器实现方法的详细攻略。 1. 前置知识 Vue.js框架基础知识 Vue.js生命周期钩子函数 Vue.js计算属性 2. 实现方法 2.1 通过setInterval实现 我们可以通过JavaScript自带的setInterval函数来实现一个简单的计时器。对于Vue.js来说,我们可以在组件中使用created生命周期函数来创建一个…

    Vue 2023年5月29日
    00
  • 使用 Vue 实现一个虚拟列表的方法

    Vue 实现虚拟列表可以有效提高大数据量列表的性能,这里提供一个实现虚拟列表的方法: 步骤1:定义组件 首先定义一个列表组件,可以按照下面的代码块来实现: <template> <div class="list" ref="list"> <div v-for="(item, in…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部