插件使用场景
- 添加全局方法或者属性,例如:vue-custom-element
- 添加全局资源:指令/过滤器/过渡等, 例如:vue-touch
- 通过全局混入来添加一些组件选项, 例如:vue-router
- 添加 Vue 实例方法,通过把它们添加到 Vue.prototype 上实现
- 一个库,提供自己的 API,同时提供上面提到的一个或多个功能。 例如:vue-route
1 | MyPlugin.install = function (Vue, options) { |
插件使用
- 通过Vue.use(myPlugin)使用, 本质是调用myPlugin.install(Vue)
- 使用插件前必须在new Vue()启动应用之前完成,实例化之前就要配置好
- 如果使用多次Vue.use多次注册相同的插件,那只会注册一次
原理
Vue.use()源码
1 | Vue.use = function (plugin) { |
通过mixin实现rules公共方法
示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14const vm = new Vue({
data: function(){
return {
foo: 10
}
},
rules: {
foo: {
validate: value => value > 1,
message: 'foo must be greater than one'
}
}
})
vm.foo = 0 // 输出 foo must be greater than one实现步骤
实现rules插件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29import Vue from 'vue'
const RulesPlugin = {
//插件应该有一个公开方法install
//install方法第一个参数:Vue构造器, 第二个参数可选的选项对象
install: function(Vue){
Vue.mixin({
created(){
//获取rules对象
const rules = this.$options.rules;
if(rules){
Object.keys(rules).forEach((key)=>{
//获取所有的rules
const {validate, message} = rules[key];
//监听, 键是变量, 值函数
this.$watch(key, newValue => {
const valid = validate(newValue);
if(valid){
console.log(message);
}
})
})
}
}
})
}
}
export default RulesPlugin;验证rules插件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36import Vue from 'vue'
import RulePlugin from 'RulePlugin';
Vue.use(RulePlugin);
const vm = new Vue({
data: function(){
return {
foo: 10
}
},
rules: {
foo: {
validate: value => value > 1,
message: 'foo must be greater than one'
}
},
created(){
//获取rules对象
const rules = this.$options.rules;
if(rules){
Object.keys(rules).forEach((key)=>{
//获取所有的rules
const {validate, message} = rules[key];
//监听, 键是变量, 值函数
this.$watch(key, newValue => {
const valid = validate(newValue);
if(valid){
console.log(message);
}
})
})
}
}
})