Vue源码之关于vm.$delete()/Vue.use()内部原理详解

yizhihongxing

Vue源码之关于vm.$delete()/Vue.use()内部原理详解

Vue.$delete()方法

在Vue中,我们可以使用vm.$delete()方法从Vue实例或嵌套对象中删除响应式属性。这个方法是私有的,也就是说它只存在于Vue内部,并没有对外暴露。下面我们来详细讲解一下Vue.$delete()方法的内部原理。

源码解析

Vue.$delete()方法的实现位于文件src/core/observer/index.js中,相应的代码如下:

export function del (target: Array<any> | Object, key: any) {
  if (Array.isArray(target) && isValidArrayIndex(key)) {
    target.splice(key, 1)
    return
  }
  const ob = target.__ob__
  if (target._isVue || (ob && ob.vmCount)) {
    process.env.NODE_ENV !== 'production' &&
      warn(
        'Avoid deleting properties on a Vue instance or its root $data ' +
        '- just set it to null.'
      )
    return
  }
  if (!hasOwn(target, key)) {
    return
  }
  delete target[key]
  if (!ob) {
    return
  }
  ob.dep.notify()
}

可以看到,Vue.$delete()方法接收两个参数,target表示要删除属性的对象,key表示要删除的属性的键名。接下来我们来分析一下Vue.$delete()方法的实现过程:

首先,检查target是否为数组,并且key是否为有效的数组索引。如果是,使用数组的splice()方法将对应的元素从target中删除。

如果target不是数组,检查它是否为Vue实例或者拥有__ob__属性的对象(即响应式对象)。如果是,输出警告信息并退出。

如果key不是target自身属性,直接返回。

最后,删除target上的key属性,并通知依赖更新。

示例说明

下面我们来看一下Vue.$delete()方法的应用示例:

let vm = new Vue({
  data: {
    obj: {
      a: 1,
      b: 2,
      c: 3
    }
  }
})
vm.$delete(vm.obj, 'a') // 从vm.obj中删除a属性

通过上述代码,我们可以看到,vm.$delete()方法成功从vm.obj对象中删除了a属性。这是一个简单的示例,但是它充分展示了Vue.$delete()方法的用法和内部原理。

Vue.use()方法

除了Vue.$delete()方法,Vue中还有另外一个重要的内部方法Vue.use()。Vue.use()方法可以让我们在Vue实例中使用插件,如Vue-router、Vuex等。下面我们来详细讲解一下Vue.use()方法的用法和内部原理。

源码解析

Vue.use()方法的实现位于文件src/core/global-api/use.js中,相应的代码如下:

export function initUse (Vue: GlobalAPI) {
  Vue.use = function (plugin: Function | Object) {
    const installedPlugins = (this._installedPlugins || (this._installedPlugins = []))
    if (installedPlugins.indexOf(plugin) > -1) {
      return this
    }

    // additional parameters
    const args = toArray(arguments, 1)
    args.unshift(this)
    if (typeof plugin.install === 'function') {
      plugin.install.apply(plugin, args)
    } else if (typeof plugin === 'function') {
      plugin.apply(null, args)
    }
    installedPlugins.push(plugin)
    return this
  }
}

Vue.use()方法接收一个参数plugin,可以是一个函数或一个对象。下面我们来分析一下Vue.use()方法的实现过程:

定义一个数组installedPlugins来保存已经安装的插件。

检查传入的插件在数组installedPlugins中是否已经安装,如果已经安装,直接返回Vue实例本身。

将传入的参数转化成数组args,并将Vue实例本身插入数组开头作为参数。

如果传入的插件对象拥有install方法,调用install方法并传入args数组作为参数。否则,直接调用plugin函数并传入args数组。

将插件插入installedPlugins数组中。

返回Vue实例本身。

示例说明

下面我们来看一下Vue.use()方法的应用示例:

import VueRouter from 'vue-router'
import Vuex from 'vuex'

Vue.use(VueRouter) // 使用VueRouter插件
Vue.use(Vuex) // 使用Vuex插件

上述代码就是使用Vue Router和Vuex插件的过程,其中,Vue.use(VueRouter)会调用VueRouter插件的install方法进行安装,Vue.use(Vuex)同理。通过这样的方式,我们可以方便地在Vue应用程序中使用各种插件。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue源码之关于vm.$delete()/Vue.use()内部原理详解 - Python技术站

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

相关文章

  • vue中改变了vuex数据视图不更新,也监听不到的原因及解决

    在vue中使用vuex进行数据管理时,有时候会出现改变了vuex数据,但是页面视图并没有更新,也没有触发相应的监听事件的情况。这通常是因为没有正确地使用Vue的响应式机制和Vuex的状态更新机制引起的。 以下是解决这个问题的攻略,包含两个示例说明。 1. 使用Vue的响应式机制 在Vue中,只有通过Vue提供的响应式方法或函数才能保证更新视图。通过JavaS…

    Vue 2023年5月27日
    00
  • vue-router源码之history类的浅析

    下面我会为你详细讲解“vue-router源码之history类的浅析”的完整攻略。 一、什么是 vue-router 的 history 类? vue-router 提供了多种模式的路由实现,其中一种就是 history 模式。这种模式使用了 HTML5 提供的 History API,可以在不刷新页面的情况下改变浏览器的 URL。 vue-router …

    Vue 2023年5月28日
    00
  • Vue filter格式化时间戳时间成标准日期格式的方法

    下面是 “Vue filter格式化时间戳时间成标准日期格式的方法”的完整攻略: 1. 什么是Vue filter? Vue.filter是Vue提供的用于全局过滤器的机制,它可以重用一些常见的文本转换用法(包括格式化时间戳),以确保我们的代码具有更高的可读性、可维护性和可重用性。 下面我们将讲解如何使用Vue filter来格式化时间戳成标准的日期时间格式…

    Vue 2023年5月28日
    00
  • 简单学习5种处理Vue.js异常的方法

    下面我将详细讲解“简单学习5种处理Vue.js异常的方法”的完整攻略。 异常处理 在Vue.js应用中,异常处理是一个必不可少的部分。因为在应用的运行过程中,难免会出现一些错误或者异常情况,需要进行合理的处理。 常见的异常 TypeError:类型不匹配,通常发生在访问null或undefined值或者使用对象上不存在的方法或属性时。 ReferenceEr…

    Vue 2023年5月27日
    00
  • 98道经典Vue面试题总结

    感谢您对本网站的关注,以下是关于《98道经典Vue面试题总结》的完整攻略。 一、前言 Vue.js 是一款流行的前端框架,已经成为很多企业和公司的项目必备技术。但是随着 Vue 的普及,Vue 面试题也越来越多,Vue 面试有可能会考到一些比较深入的知识点。因此,对于很多初学者来说,学习 Vue 的同时,也要去了解一些常见的面试题。 本篇文档涵盖了98道面试…

    Vue 2023年5月28日
    00
  • 浅谈vue的第一个commit分析

    下面我来详细讲解”浅谈vue的第一个commit分析”的完整攻略。 1. 了解Vue.js的号召与目标 Vue.js起源于2013年,是由一名华人开发者尤雨溪(Evan You)所创建的。他旨在创造一款简单、灵活的 JavaScript 框架用于构建用户界面。Vue.js也称为渐进式JavaScript框架,具有轻量级、易上手、高效渲染等特点。Vue.js近…

    Vue 2023年5月27日
    00
  • 从vue基础开始创建一个简单的增删改查的实例代码(推荐)

    下面我将详细讲解如何从Vue基础开始创建一个简单的增删改查的实例代码: 1. 创建基于Vue的前端项目 在创建Vue的前端项目时,需要先安装Vue的脚手架工具Vue CLI。具体安装方法可以参考官方文档:Vue CLI 安装文档。 安装完成后,打开命令行工具,进入到项目存放的目录下,使用以下命令创建一个新的Vue项目: vue create my-proje…

    Vue 2023年5月28日
    00
  • vue中遇到的坑之变化检测问题(数组相关)

    1. 问题背景 在Vue中,当数组相关数据更新时,会对应的更新DOM元素,但是在更新数组时,我们需要注意到一些坑点。 2. 变化检测方式 Vue采用的是基于 JavaScript 对象的变化检测机制,在更新一个对象时,Vue 会遍历它的每一个属性,并且使用 Object.defineProperty 把这个属性转为 getter 和 setter。 3. 数…

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