vue.use()原理和Vue插件的开发使用

参考:

https://cn.vuejs.org/v2/guide/plugins.html

https://juejin.im/post/5d8464a76fb9a06b3260ad30

https://www.cnblogs.com/adouwt/p/9211003.html

一、背景

  1. 为什么在引入Vue-Router、ElementUI的时候需要Vue.use()?而引入axios的时候,不需要Vue.use()?  Vue.use()是为Vue插件(需要依赖vue才能实现)进行初始化的,而axios不用依赖vue也能执行,所以不需要使用Vue.use()进行初始化。
  2. Vue-Router、ElementUI在Vue.use()分别做了什么?
  3. Vue.use原理
  4. 如何编写和使用一个Vue插件?

二、vue.use()原理

Vue.use是官方提供给开发者的一个api,用来注册、安装类型Vue插件的。

该方法需要在调用 new Vue() 之前被调用。

当 install 方法被同一个插件多次调用,插件将只会被安装一次。

1.vue.use的使用:

在main.js中调用:

Vue.use(ElementUi);
Vue.use(Vuex);
Vue.use(Router);

 

2.vue.use()原理:

  1. 检查插件是否安装,如果安装了就不再安装
  2. 如果没有没有安装,那么调用插件的install方法,并传入Vue实例
export function initUse (Vue: GlobalAPI) {
  Vue.use = function (plugin: Function | Object) {
    // 获取已经安装的插件
    const installedPlugins = (this._installedPlugins || (this._installedPlugins = []))
    // 看看插件是否已经安装,如果安装了直接返回
    if (installedPlugins.indexOf(plugin) > -1) {
      return this
    }

    // toArray(arguments, 1)实现的功能就是,获取Vue.use(plugin,xx,xx)中的其他参数。
    // 比如 Vue.use(plugin,{size:'mini', theme:'black'}),就会回去到plugin意外的参数
    const args = toArray(arguments, 1)
    // 在参数中第一位插入Vue,从而保证第一个参数是Vue实例
    args.unshift(this)
    // 插件要么是一个函数,要么是一个对象(对象包含install方法)
    if (typeof plugin.install === 'function') {
      // 调用插件的install方法,并传入Vue实例
      plugin.install.apply(plugin, args)
    } else if (typeof plugin === 'function') {
      plugin.apply(null, args)
    }
    // 在已经安装的插件数组中,放进去
    installedPlugins.push(plugin)
    return this
  }
}

 

3.创建vue插件

(1)创建plugins文件夹存放插件文件(loading和toast两个插件)

(2)代码:loading是通过组件的形式使用,生成在#app中。toast是通过js方法使用,调用后插入#app下方

loading.vue:

<template>
    <div class="nwd-loading" v-show="show">
        <div>{{text}}</div>
    </div>
</template>

<script>
    export default {
        props: ['show', 'text']
    }
</script>

loading.js:

import Loading from './loading.vue'
export default {
	install(Vue,options) {
		Vue.component('loading', Loading);
	}
}

 

toast.vue:

<template>
    <transition name="fade">
        <div class="toast" v-show="show">
            {{message}}
        </div>

    </transition>
</template>

<script>
export default {
  data() {
    return {
      show: false,
      message: "提示框"
    };
  }
};
</script>

<style scoped>
.toast {
  position: fixed;
  top: 40%;
  left: 50%;
  margin-left: -15vw;
  padding: 2vw;
  width: 30vw;
  font-size: 4vw;
  color: #fff;
  text-align: center;
  background-color: rgba(0, 0, 0, 0.8);
  border-radius: 5vw;
  z-index: 999;
}

.fade-enter-active,
.fade-leave-active {
  transition: 0.3s ease-out;
}
.fade-enter {
  opacity: 0;
  transform: scale(1.2);
}
.fade-leave-to {
  opacity: 0;
  transform: scale(0.8);
}
</style>

toast.js:

import Toast from './toast.vue'

export default {
	install(Vue, options) {
		// 生成一个Vue子类
		const toast = Vue.extend(Toast);

		// 生成该子类的实例
		let toastInstance = new toast();
		console.log(toastInstance);

		// 将实例挂载到新创建的div上
		toastInstance.$mount(document.createElement('div'));

		// 将此div加入全局挂载点内部,#app下方
		console.log(toastInstance.$el);
		document.body.appendChild(toastInstance.$el);

		// 通过Vue注册一个原型方法
		// 所有实例共享这个方法
		Vue.prototype.$toast = (msg, duration = 2000) => {
			toastInstance.message = msg; 
			toastInstance.show = true;
			setTimeout(()=>{
				toastInstance.show = false;
			}, duration);
		}
	}	
}

main.js引入:

import Vue from 'vue'
import App from './App'
import router from './router'
import Loading from './plugins/loading/loading.js'
import Toast from './plugins/toast/toast.js'

Vue.use(Loading)
Vue.use(Toast)


Vue.config.productionTip = false

/* eslint-disable no-new */
var vue1 = new Vue({
  el: '#app',
  router,
  components: { App },
  template: '<App/>'
})

HelloWorld.vue组件使用

<template>
  <div class="hello">
    <!-- 使用loading -->
    <loading :show="show" :text="msg"></loading>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  data () {
    return {
      show:true,
      msg: 'I am loading'
    }
  },
  created() {
    // 使用toast
    this.$toast('司法局防辐射服', 30000);
  }
}
</script>

 

三、插件打包并发布

1.新建一个项目:test-toast

vue init webpack-simple 项目名
cd test-toast
npm install //安装依赖

2.将上面的toast.js和toast.vue放入src目录中,toast.js重命名为index.js

 3.修改webpack.config.js:

  entry: './src/index.js',
  output: {
    path: path.resolve(__dirname, './dist'),
    publicPath: '/dist/',
    filename: 'testToast.js' //打包后的文件名
  },

4.打包:

npm run build

5.修改package.json:

//"private": true, //删除这行
//使用时默认寻找的文件
"main": "dist/testToast.js",

6.登录npm账号:

npm login

7.发布插件:

npm publish

 

### 回答1: vue.component和vue.use都是Vue.js中的方法,但是它们的作用不同。 vue.component用于注册全局组件,可以在任何Vue实例中使用。例如: ``` Vue.component('my-component', { // 组件选项 }) ``` 而vue.use用于安装Vue.js插件,可以在Vue实例中使用插件提供的功能。例如: ``` Vue.use(myPlugin) ``` 其中myPlugin是一个Vue.js插件,它需要提供一个install方法。在install方法中,可以注册全局组件、指令、混入等。例如: ``` const myPlugin = { install(Vue, options) { // 注册全局组件 Vue.component('my-component', { // 组件选项 }) // 注册全局指令 Vue.directive('my-directive', { // 指令选项 }) // 注册全局混入 Vue.mixin({ // 混入选项 }) } } ``` 总之,vue.component用于注册全局组件,vue.use用于安装Vue.js插件。 ### 回答2: 在Vue.js框架中,Vue.component和Vue.use都是用于组件注册的方法。但它们之间有一些区别。 Vue.component是Vue.js用于定义全局或局部组件的方法,可以在全局或局部范围内注册一个组件,使之在应用中可以被多个组件使用。它接收两个参数:第一个参数是组件的名字,第二个参数是一个选项对象,如下: ``` Vue.component('my-component', { // 组件选项 }) ``` Vue.useVue.js插件的方法,用于在全局范围内注册Vue插件Vue插件通常是通过一个对象或一个函数暴露出来,该对象或函数要具有一个install方法。使用Vue.use可以安装插件并将该插件自动注册到Vue实例的所有组件中。使用Vue.use时,必须将插件作为参数传递给Vue.use方法,如下: ``` // 引入插件 import MyPlugin from 'path/to/MyPlugin.js' // 安装插件 Vue.use(MyPlugin) ``` 总之,Vue.component和Vue.use都是用于组件注册的方法,但Vue.component用于组件的定义和注册,Vue.use则用于全局插件的注册和安装,二者的用途和效果不同。 ### 回答3: Vue.js是一款非常流行的JavaScript框架,它提供了很多有用的特性和工具来方便我们开发Web应用程序。Vue.js中常用的两个API是vue.component和vue.use。它们都是以插件的形式来扩展Vue.js的功能。虽然它们有一些相似之处,但是也有一些不同之处。本文将从多个方面对它们进行比较,以便更好地理解它们的作用和用法。 1、作用 vue.component的作用是注册一个全局或局部组件。这个组件可以被其他组件或者模板文件引用。我们可以为组件设置属性(prop)和事件(event),并可以在组件中使用响应式的数据。这样可以实现组件的代码重用和灵活性。 vue.use的作用是注册一个Vue.js插件插件是一个包含了一些预置功能的JavaScript对象,可以扩展Vue.js的全局或局部功能。插件一般包含了一些全局的属性、指令、组件以及一些工具方法。使用插件可以方便地扩展Vue.js的功能,而且插件还可以被其他开发者共享和复用。 2、用法 vue.component的用法: 全局注册 Vue.component('component-name', { // options }) 局部注册 new Vue({ // ... components: { 'component-name': { // options } } }) vue.use的用法: Vue.use(plugin) 3、调用方式 vue.component 全局组件可以直接在任何地方使用,局部组件只能在注册组件的实例或其子组件中使用vue.use 插件可以在Vue根实例之前调用,也可以在Vue根实例之后调用。在调用use方法之后,插件会被安装并立即生效。插件通常是全局可用的,可以在Vue的组件中使用。 4、局限性 vue.component 局部注册的组件不可以在父级组件中使用,只能在父级组件的模板中使用。此外,全局组件也有可能会被其他库或者开发使用同样的名称而冲突。 vue.use 由于插件本质上是一个JavaScript对象,因此插件可以被修改或覆盖。此外,插件还必须暴露一个install方法,否则使用use安装插件时会报错。 总结: vue.component是Vue.js的组件注册方法,用于注册全局或局部的组件,以实现组件的代码复用和灵活性。 vue.useVue.js的插件注册方法,用于注册插件以扩展Vue.js的全局或局部功能,以方便开发开发和复用Vue.js的扩展功能。 两个API虽然有很多相似之处,但是在实际使用中也存在很多不同之处。了解这些差异和各自的用法可以帮助我们更好地使用Vue.js,提高开发效率和质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值