解析Vue.use()是干什么的

目录
  • 1. Vue.use是什么,了解一下!?
    • 1.1 main.js中的Vue.use()
    • 1.2 简单解释一下这里的import的逻辑,
    • 1.3 Vue.use()代码
  • 2. 看一下 vueEsign 插件的install是什么?
  • 3.看一下 element-ui的install是什么?
  • 4. Vue.use() 总结
  • 5.为什么有的库就不需要使用Vue.use

start

  • 前几天使用了一个别人封装的电子签名组件:vueEsign。
  • 在初始化的时候有这么一行代码:Vue.use(vueEsign)
  • 之前使用element-ui,也需要使用Vue.use()
  • 这行代码到底是什么?学习一下。

本文所有演示内容,vue.js版本为2.6.14

1. Vue.use是什么,了解一下!?

1.1 main.js中的Vue.use()

import Vue from 'vue'
import App from './App.vue'
import router from './router'

import vueEsign from 'vue-esign'
Vue.use(vueEsign)

Vue.config.productionTip = false

new Vue({
  router,
  render: h => h(App)
}).$mount('#app')

1.2 简单解释一下这里的import的逻辑,

  • 如果from后面是路径,直接沿路径去寻找对应文件。
  • 如果from后面是一个名称,那就引入是第三方模块,会去node_modules中寻找对应名称的文件夹。

node_modulespackage.jsonmain属性

1.3 Vue.use()代码

找到对应文件

对应代码

  function initUse (Vue) {

  // 1. Vue.use是一个函数
  Vue.use = function (plugin) {

    // 2. 定义一个数组 如果this._installedPlugin不存在,会执行`this._installedPlugins = []
    var installedPlugins = (this._installedPlugins || (this._installedPlugins = []));

    // 3. 判断是否已经注册了,已经注册了直接return
    if (installedPlugins.indexOf(plugin) > -1) {
      return this
    }

    // 4.获取其他参数  例如: Vue.use(plugin,a,b,c) 中的 a b c
    var args = toArray(arguments, 1);

    // 5.参数第一项,加一个Vue实例进去
    args.unshift(this);

    // 6. plugin 有 install 这个方法
    if (typeof plugin.install === 'function') {
      // 7. 执行一下install,再把参数传递进去  (可以看插件的install方法,接受第一个参数,就是Vue实例)
      plugin.install.apply(plugin, args);
    } else if (typeof plugin === 'function') {
      // 8. 如果plugin 本身就是函数 直接执行
      plugin.apply(null, args);
    }

    // 9. 来一个数组存储已经注册的插件
    installedPlugins.push(plugin);

    return this
  };
}

2. 看一下 vueEsign 插件的install是什么?

node_modules\vue-esign\src\idnex.js
// 1. 引入一个vue组件,实际上就是一个对象
import vueEsign from './index.vue'

// 2.对象install属性是一个方法,它接受一个参数 Vue
vueEsign.install = function (Vue) {

  // 3. 判断是否已经安装了这个插件(这里this指向为vueEsign,在Vue.use中用apply改写的)
  if (this.installed) {
    return
  }
  this.installed = true

  // 4. 在Vue上注册一下组件
  Vue.component('vueEsign', vueEsign)
}
export default vueEsign

3.看一下 element-ui的install是什么?

node_modules\element-ui\src\index.js
// 1. 它也是一个函数
const install = function(Vue, opts = {}) {
  // 2.读取了部分其他本地化配置
  locale.use(opts.locale);
  locale.i18n(opts.i18n);

  // 3.components就是element-ui的组件组成的数组,遍历一下,在Vue上注册了这些组件。
  // (!!可以发现这里和另一个插件有相同点,都是在install的第一个参数Vue上注册组件,)
  components.forEach(component => {
    Vue.component(component.name, component);
  });

  // 4. 这里的 Vue.use 原理是一样的(可以对照截图,它这里后续是在Vue上注册了指令)
  Vue.use(InfiniteScroll);
  Vue.use(Loading.directive);

  // 5.下面都是在Vue原型上挂载属性或方法
  Vue.prototype.$ELEMENT = {
    size: opts.size || '',
    zIndex: opts.zIndex || 2000
  };

  Vue.prototype.$loading = Loading.service;
  Vue.prototype.$msgbox = MessageBox;
  Vue.prototype.$alert = MessageBox.alert;
  Vue.prototype.$confirm = MessageBox.confirm;
  Vue.prototype.$prompt = MessageBox.prompt;
  Vue.prototype.$notify = Notification;
  Vue.prototype.$message = Message;

};

4. Vue.use() 总结

  1. 首先 Vue.use 本身是一个函数;
  2. Vue.use这个函数做了这些操作:
  • 判断插件是否注册;
  • 如果插件自带insatll属性,执行它,同时传递一个Vue构造函数作为第一个参数,以及use中的其他参数;
  • 如果插件本身就是函数,执行它,同时传递一个Vue构造函数作为第一个参数,以及use中的其他参数
  • 记录这个插件已经注册;

3.暂时遇到的插件本身都是一个对象,然后install中都会拿到传递来的Vue构造函数进行一些绑定操作。例如绑定组件,例如在原型上添加方法。

5.为什么有的库就不需要使用Vue.use

例如常见的aixos引入

import axios from 'axios'
Vue.prototype.$axios=axios

axios本身是不依赖Vue去运行的,axios本身就可以在浏览器端或者node端都能进行http请求。

这里挂载到Vue原型的$axios属性上,只是为了方便使用。

end

  • 感觉就是 组件 需要和 Vue构造函数 进行交互的时候,才需要Vue.use()。
  • 本质就是传递一个 Vue构造函数 给插件使用,仅此而已。

到此这篇关于Vue.use()是干什么的的文章就介绍到这了,更多相关Vue.use()内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 关于axios不能使用Vue.use()浅析

    前言 最近在学习axios,在使用过程遇到了一些问题,觉着有必要给大家分享下,关于axios的基本知识大家可以参考这篇文章:axios基本入门用法教程 ,下面话不多说了,来一起看看详细的介绍吧. 问题 相信很多人在用Vue使用别人的组件时,会用到 Vue.use() .例如:Vue.use(VueRouter) . Vue.use(MintUI) .但是用 axios时,就不需要用 Vue.use(axios) ,就能直接使用.那这是为什么呐? 答案 因为 axios 没有 install. 什

  • Vue 实现创建全局组件,并且使用Vue.use() 载入方式

    自定义vue组件,一般是局部引用的方式载入,使用的时候,在应用的组件中使用 import moduleName from 'module' 导入,在components中注册 <template> <div class="app-NewsInfo"> <h3>{{info.title}}</h3> <!-- 新闻评论子组件. --> <comment :id="id"></comment&

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

    vm.$delete() vm.$delete用法见官网. 为什么需要Vue.delete()? 在ES6之前, JS没有提供方法来侦测到一个属性被删除了, 因此如果我们通过delete删除一个属性, Vue是侦测不到的, 因此不会触发数据响应式. 见下面的demo. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta na

  • 浅谈vue自定义全局组件并通过全局方法 Vue.use() 使用该组件

    简介 Vue.use( plugin ):安装 Vue.js 插件.如果插件是一个对象,必须提供 install 方法.如果插件是一个函数,它会被作为 install 方法.install 方法将被作为 Vue 的参数调用. 当 install 方法被同一个插件多次调用,插件将只会被安装一次. Vue.js 的插件应当有一个公开方法 install .这个方法的第一个参数是 Vue 构造器,第二个参数是一个可选的选项对象: MyPlugin.install = function (Vue, op

  • vue自定义组件(通过Vue.use()来使用)即install的用法说明

    在vue项目中,我们可以自定义组件,像element-ui一样使用Vue.use()方法来使用,具体实现方法: 1.首先新建一个Cmponent.vue文件 // Cmponent.vue <template> <div> 我是组件 </div> </template> <script> export default { } </script> <style scoped> div{ font-size:40px; col

  • Vue.use()在new Vue() 之前使用的原因浅析

    使用Vue前端框架开发有些时间了,官方文档对于插件开发也有详细的介绍.最近强迫症犯了,老在想为什么Vue.use函数执行,要在Vue实例化即new Vue(options)之前.解铃还须系铃人,这个问题只能通过看源码解决,于是... 先看Vue.use做了什么 Vue.use = function (plugin: Function | Object) { //Vue构造函数上定义_installedPlugins 避免相同的插件注册多次 const installedPlugins = (th

  • Vue中Vue.use()的原理及基本使用

    目录 前言 1. 举例理解 2. 分析源码 3. 小结 总结 前言 相信很多人在用 Vue 使用别人的组件时,会用到 Vue.use() .例如:Vue.use(VueRouter).Vue.use(MintUI).但是用 axios时,就不需要用 Vue.use(axios),就能直接使用.那这是为什么呐? 因为 axios 没有 install. 1. 举例理解 在新建的项目中创建两个文件:plugins.js use.js: // plugins.js const Plugin1 = {

  • Vue.use()的用法和install的用法解析

    目录 Vue.use()和install用法 介绍 为什么这样做? Vue.use为什么要使用install 疑问 从源码分析 vue官网是这样说的 Vue.use()和install用法 介绍 在vue的main.js中,我们经常使用Vue.use(xx)方法.比如我们引入elementUI,在main.js中,我们一般通过如下代码引入: import ElementUI from 'element-ui' import 'element-ui/lib/theme-chalk/index.cs

  • 解析Vue.use()是干什么的

    目录 1. Vue.use是什么,了解一下!? 1.1 main.js中的Vue.use() 1.2 简单解释一下这里的import的逻辑, 1.3 Vue.use()代码 2. 看一下 vueEsign 插件的install是什么? 3.看一下 element-ui的install是什么? 4. Vue.use() 总结 5.为什么有的库就不需要使用Vue.use start 前几天使用了一个别人封装的电子签名组件:vueEsign. 在初始化的时候有这么一行代码:Vue.use(vueEsi

  • 解析Vue 2.5的Diff算法

    DOM"天生就慢",所以前端各大框架都提供了对DOM操作进行优化的办法,Angular中的是脏值检查,React首先提出了Virtual Dom,Vue2.0也加入了Virtual Dom,与React类似. 本文将对于Vue 2.5.3版本中使用的Virtual Dom进行分析. updataChildren是Diff算法的核心,所以本文对updataChildren进行了图文的分析. 1.VNode对象 一个VNode的实例包含了以下属性,这部分代码在src/core/vdom/v

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

    前言 最近死磕了一段时间vue源码,想想觉得还是要输出点东西,我们先来从Vue提供的Vue.set()和this.$set()这两个api看看它内部是怎么实现的. Vue.set()和this.$set()应用的场景 平时做项目的时候难免不会对 数组或者对象 进行这样的骚操作操作,结果发现,咦~~,他喵的,怎么页面没有重新渲染. const vueInstance = new Vue({ data: { arr: [1, 2], obj1: { a: 3 } } }); vueInstance.

  • 原理深度解析Vue的响应式更新比React快

    前言 我们都知道 Vue 对于响应式属性的更新,只会精确更新依赖收集的当前组件,而不会递归的去更新子组件,这也是它性能强大的原因之一. 例子 举例来说 这样的一个组件: <template> <div> {{ msg }} <ChildComponent /> </div> </template> 我们在触发 this.msg = 'Hello, Changed~'的时候,会触发组件的更新,视图的重新渲染. 但是 <ChildCompone

  • 全面解析Vue中的$nextTick

    当在代码中更新了数据,并希望等到对应的Dom更新之后,再执行一些逻辑.这时,我们就会用到$nextTick funcion callback(){ //等待Dom更新,然后搞点事. } $nextTick(callback): 官方文档对nextTick的解释是: 在下次 DOM 更新循环结束之后执行延迟回调.在修改数据之后立即使用这个方法,获取更新后的 DOM. 那么,Vue是如何做的这一点的,是不是在调用修改Dom的Api之后(appendChild, textContent = "xxxx

  • 解析vue的provide和inject使用方法及其原理

    首先来谈谈我们为什么要使用provide/inject呢?对于爷爷和孙子组件之间,甚至太爷爷组件与孙子组件通信我们用vuex不就ok了. 那事实的确如此,但是,请听我说但是,有时候你项目比较小甚至组件通信的场景很少的,那么你引入vuex就为了那么几个通信传参是不是很浪费啊.有人也可能会想到使用$parent获取父组件实例,来获取data/methods,这种两层就还好,那多层呢,组件嵌套很深的话,你怎么弄?写个函数把$parent再封装一下.那不是很麻烦吗,现成的你不用非要曲线救国.哈哈-扯远了

  • 解析vue中的$mount

    本文主要是带领大家分析$mount. $mount所做的工作从大体来讲主要分为3步: 1.如果你的option里面没有 render 函数,那么,通过 compileToFunctions 将HTML模板编译成可以生成VNode的Render函数. 2.new 一个 Watcher 实例,触发 updateComponent 方法. 3.生成vnode,经过patch,把vnode更新到dom上. 由于篇幅有限,这里先说前两步,第三步下篇说. 好,下面具体的说.首先,我们来到 $mount 函数

  • 深入解析Vue 组件命名那些事

    There are only two things in Computer Sciences: cache invalidation and naming things. -- Phil Karlton 诚如上述所言,编程中变量命名确实令人很头疼.我们模糊地知道,Vue 组件的名称最好不要和原生 HTML 标签相同.为了避免重名,通常会在组件名称前面加上一个前缀,如 el-button.el-input.el-date-picker.这通常不会有什么问题,但有时候你的模板中混杂了原生 HTML

  • 全面解析vue中的数据双向绑定

    1.vue中数据的双向绑定采用的时候,数据劫持的模式.其实主要是用了Es5中的Object.defineProperty;来劫持每个属性的getter,和setter.这也正是Vue不兼容IE8以下的原因. 2.Object.defineProerty(); var obj = {}; Object.defineProperty(obj,"hello",{ enumerable: true, //表示这个属性能够通过 for -- in 循环 (是否可枚举); configurable

  • 深入解析vue 源码目录及构建过程分析

    ​" 本文主要梳理一下vue代码的目录,以及vue代码构建流程,旨在对vue源码整体有一个认知,有助于后续对源码的阅读." 一.目录结构 上图是对vue的代码的所有目录进行的梳理,其中源码位于src目录下,下面对src下的目录进行介绍. compiler 该目录是编译相关的代码,即将 template 模板转化成 render 函数的代码. vue 提供了 render 函数,render 函数作用是用来创建 VNode,但在平时开发中,绝大多数情况下使用 template 来创建 H

随机推荐