Vue.js 插件

1.前言

vue的插件其实通过操作Vue这个对象,为其扩展新的功能。例如:

// 1. 添加全局方法或 property
  Vue.myGlobalMethod = function () {
    // 逻辑...
  }

  // 2. 添加全局资源
  Vue.directive('my-directive', {
    bind (el, binding, vnode, oldVnode) {
      // 逻辑...
    }
    ...
  })

  // 3. 注入组件选项
  Vue.mixin({
    created: function () {
      // 逻辑...
    }
    ...
  })

  // 4. 添加实例方法
  Vue.prototype.$myMethod = function (methodOptions) {
    // 逻辑...
  }

2.插件的封装

  • 要拿到Vue这个对象,不同的模式有不一样的方法:
  • 在普通模式中,Vue框架以script标签的形式引入之后,Vue作为全局变量,插件直接对他进行操作即可。
  • 在脚手架模式中,各个模块是相互独立的,其他模块无法直接读取Vue这个对象。虽然可以通过import方式引入Vue进行操作,这是这样不符合规范。
  • 实际的做法是:定义一个函数,在函数内部对Vue进行操作。插件定义一个install方法,当执行Vue.use(plugin) 是,则执行这个install方法
  • 如果plugin是一个对象,必须提供 install 方法。如果插件是一个函数,它会被作为 install 方法。
  • 该方法需要在调用 new Vue() 之前被调用。
  • 当 install 方法被同一个插件多次调用,插件将只会被安装一次。

3.简单的实例:编写一个添加自定义指令和过滤器的插件

  • 非模块化模式:
//确保在这之前已经通过script标签引入了Vue

//添加全局的自定义指令 全部转换成大写
Vue.directive('upper-text',function(el,binding){
    el.innerText = binding.value.toUpperCase();
})

//添加全局过滤器 全部转换成小写
Vue.filter('toLowerCase',function(val){
    return val.toLowerCase()
})
  • 模块化模式:
//1.创建一个对象
const myPlugin = {}

//为其添加install方法,接收Vue这个参数
myPlugin.install = function(Vue){ 
    //测试
    console.log('install方法执行了')

    //添加全局的自定义指令
    Vue.directive('upper-text',function(el,binding){
        el.innerText = binding.value.toUpperCase();
    })

    //添加全局过滤器
    Vue.filter('toLowerCase',function(val){
        return val.toLowerCase()
    })
}

//暴漏该对象
export default myPlugin
//入口文件
import Vue from 'vue'
import App from './App'
import myPlugin from './plugin/myPlugin.js'

////执行myPlugin.install(Vue)
Vue.use(myPlugin)
  • 使用插件
<body>
    <div id="app">
        <!-- 默认 -->
        <p v-html="msg"></p>
        <!-- 使用插件的自定义指令 -->
        <p v-upper-text="msg"></p>
        <!-- 使用过滤器 -->
        <p>{{msg | toLowerCase}}</p>
    </div>
</body>

执行结果:

<div id="app">
    <p>Good Life</p> 
    <p>GOOD LIFE</p> 
    <p>good life</p>
</div>

4.添加实例方法

  • 在脚手架项目中,组件要用axios时,需要在组件中重新引用,如果在入口js文件中引入一次axios,并挂在到Vue原型链中,那么后面所有的组件都能访问这个对象,无需再次引用。
import Vue from 'vue'
//引入axios
import axios from 'axios'
//创建实例
const ajax = axios.create({
  baseURL: 'https://api.example.com'
})
//将实例挂在到原型链中
Vue.prototype.$ajax = ajax

app.vue

<script>
export default {
  data(){
    return {
      msg:'Good Life'
    }
  },
  created(){
      this.$ajax.get('/api/getMsg').then(res => {
        console.log(err)
      }).catch(err => {
        console.log(err)
      })
    }
}
</script>
posted @ 2019-11-11 22:33  ---空白---  阅读(206)  评论(0编辑  收藏  举报