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

yizhihongxing

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之Axios的异步通信详解

    Vue之Axios的异步通信详解 在Vue中,我们常常需要通过异步通信,从后端服务器获取数据以更新前端的视图。Axios是一个基于Promise的HTTP客户端库,可以方便地实现异步通信,并且可以处理跨域请求。 安装和引入 在使用Axios之前,需要先安装和引入。 安装 使用npm安装: npm install axios –save 引入 在Vue组件中…

    Vue 2023年5月27日
    00
  • 详解vue-cli3开发Chrome插件实践

    详解vue-cli3开发Chrome插件实践 前言 Vue-CLI 3是Vue.js发布的脚手架构建工具。它易于使用,且支持自定义配置,本文就是基于Vue-CLI 3来开发Chrome插件的。 环境 在开始之前,确保本地已经安装了Node.js和Vue-CLI 3,安装方法如下: 1.下载 Node.js:https://nodejs.org/en/down…

    Vue 2023年5月27日
    00
  • Vue组件中的自定义事件你了解多少

    当我们在vue组件中进行数据交互时,父组件向子组件传递了数据,在子组件中操作了这些数据,并根据需求将结果返回给父组件时,我们就需要用到自定义事件。自定义事件可以让我们在父组件中监听到子组件事件的触发并获取子组件中需要返回的数据,从而完成父子组件间的数据交互。 以下是自定义事件的步骤和示例: 步骤一:在子组件中定义自定义事件并触发 在子组件中通过 this.$…

    Vue 2023年5月28日
    00
  • Vue生命周期中的八个钩子函数相机

    Vue生命周期中的八个钩子函数是Vue组件在创建、挂载、更新、销毁过程中执行的钩子函数。这些钩子函数在Vue组件中起到了重要的作用,以便开发者在这些组件生命周期的不同时期进行不同的操作。这八个钩子函数分别是: beforeCreate:在Vue实例被创建后,数据观测 (data observer) 和 event/watcher 事件配置之前被调用。 cre…

    Vue 2023年5月28日
    00
  • 使用Vue写一个todoList事件备忘录经典小案例

    讲解“使用Vue写一个todoList事件备忘录经典小案例”的完整攻略。 1. 准备工作 在开始实践之前,需要做一些准备工作: 安装Vue Vue可以通过CDN或者npm安装,这里介绍使用npm安装的方式: npm install vue 创建Vue的实例 在html文件中引入Vue,然后创建一个Vue实例,用于绑定页面元素和数据: <!DOCTYPE…

    Vue 2023年5月29日
    00
  • vue和小程序项目中使用iconfont的方法

    为了在Vue和小程序项目中使用iconfont,需要遵循以下步骤: 步骤1:注册iconfont账号并添加图标资源 首先需要注册一个iconfont账号,并创建一个新项目以添加所需的图标资源。在添加完成后,可以在账号中找到相应的图标链接。 步骤2:复制链接并引入项目 从iconfont的项目页面复制图标链接,并将其添加到Vue或小程序项目中的HTML文件中:…

    Vue 2023年5月27日
    00
  • 关于Vue3&TypeScript的踩坑汇总

    关于Vue3&TypeScript的踩坑汇总 简介 Vue3是一款非常流行的JavaScript框架,提供了许多强大的功能和工具,使得开发复杂的前端应用程序变得更加容易。与此同时,TypeScript是一种强类型的JavaScript语言,它可以提供更好的可读性和可维护性,在Vue3的开发过程中也极其有用。但是,在使用Vue3和TypeScript的…

    Vue 2023年5月28日
    00
  • vue3父子组件传值中props使用细节浅析

    下面开始详细讲解“vue3父子组件传值中props使用细节浅析”的完整攻略。 1. 父组件向子组件传值 1.1 父组件使用props向子组件传值 在Vue3中,使用props向子组件传值与Vue2相同。在父组件中定义数据,然后在子组件中通过props接收即可。 // 父组件 <template> <child :msg="mess…

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