从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源码解析之数据响应系统的使用 在Vue源码解析中,数据响应系统是一个非常重要的内容。数据响应系统可以监听数据变化,当数据变化时,自动更新页面的内容,这也是Vue能够实现数据驱动视图的能力。在Vue中,数据响应系统的实现采用的是Proxy和defineProperty这两个对象。 使用Proxy实现响应式数据 简介 在Vue中,数据响应系统的实现采用的是…

    Vue 2023年5月27日
    00
  • 使用vue插件axios传数据的Content-Type及格式问题详解

    使用Vue插件axios传送数据时,我们需要了解有关Content-Type的知识。Content-Type是HTTP头部中的一个域,表示发送数据的媒体类型和字符集。在传送数据时,我们需要根据接受方所期望的Content-Type的类型,构造对应的数据格式来传输数据。 简单来说,如果请求的Content-Type为‘application/json’, 则P…

    Vue 2023年5月28日
    00
  • vue.js数据绑定操作详解

    Vue.js 数据绑定操作详解 Vue.js是一个流行的前端JavaScript框架,它最为突出的特性就是数据绑定。本文介绍Vue.js中的数据绑定操作,包括双向绑定、单向绑定、计算属性、侦听器等内容。同时在本文中,我们将以两条实例说明来进一步解析Vue.js的数据绑定操作。 双向绑定 Vue.js最为著名的特性就是双向绑定。即数据流可以自动的从视图更新到数…

    Vue 2023年5月27日
    00
  • Vue3中简单使用Mock.js方法实例分析

    让我来详细讲解“Vue3中简单使用Mock.js方法实例分析”的完整攻略。 什么是Mock.js Mock.js是一个前端模拟数据生成库,可以轻松生成随机数据,拦截 Ajax 请求及设置模拟数据,支持为前后端分离开发提供帮助。Mock.js可以帮助前端开发人员快速构建原型,演示和测试。 在Vue开发中,我们可以使用Mock.js来模拟后端接口,以方便本地开发…

    Vue 2023年5月28日
    00
  • 详解使用vuex进行菜单管理

    对于“详解使用Vuex进行菜单管理”的完整攻略,以下是步骤和示例说明: 1. 确定Vuex的状态管理 在使用Vuex进行菜单管理之前,需要确定有哪些状态需要在Vuex中进行管理。在本教程中,我们需要管理的状态有: 菜单数据:用于渲染整个菜单。 当前菜单项:用于存储当前选择的菜单项,以便在页面中高亮显示。 打开的菜单项:用于存储当前展开的菜单项。 你可以在Vu…

    Vue 2023年5月27日
    00
  • 基于axios 的responseType类型的设置方法

    关于基于axios的responseType类型的设置方法,我可以给你讲解一下。下面是一份详细攻略: 什么是responseType? responseType是指定响应的数据类型,常用的有五种,分别是: json :返回JSON数据 arraybuffer :返回二进制数据 blob :返回二进制数据 document :返回HTML文档 text :返回…

    Vue 2023年5月28日
    00
  • vue项目中实现图片预览的公用组件功能

    下面我将为你详细讲解在Vue项目中实现图片预览的公用组件功能的完整攻略。 背景 图片预览是我们在Vue开发中常常需要用到的功能,但很多时候我们需要在多个页面上用到,所以我们需要将其进行封装为公用组件。 实现方式 第一步:安装插件 我们可以使用vue-preview插件来实现图片预览的功能,该插件支持缩小、放大、逆时针旋转、顺时针旋转、删除功能,使用比较方便。…

    Vue 2023年5月28日
    00
  • Vuex中的Mutations的具体使用方法

    使用 Vuex 来管理 Vue.js 应用的状态,Mutations 是其中的一个重要概念,它可以对 Vuex 中的State状态进行修改,能够保证状态的唯一性以及状态的修改追踪。下面是“Vuex中的Mutations的具体使用方法”的完整攻略: Mutations是什么 在 Vuex 中,Mutation 就是一种修改状态的方法,它能够保证 Vuex 中的…

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