随着使用 Vue.js
做项目,每天都是写组件,渐渐形成了这种思维,用 vue.js
的项目都是由路由和组件这两个重要部分组成,渐渐忽略了本身也是有插件这个概念的。那么 vue.js
中的组件是什么样子的,它都能干些什么,它和传统的DOM结构驱动的插件有何不同?
vue插件的使用
看过 vue.js
中文档的同学会发现它写的并不明确,反观英文文档就介绍的比较好。
使用 vue.js
插件需要暴漏一个 install
方法。这个方法将会被它的第一个参数(该参数是一个Vue的构造函数) Vue
调用,第二个参数是一个可选项对象。
写一个 vue.js
的插件就是将要执行的代码添加到 vue.js
上。
vue.js
插件使用方式
- 添加方法和属性到其构造函数上
- 添加方法和属性到其原型链上
- 借助于
vue.js
暴露的 Vue.mixin() 和 Vue.directive() 方法
这两种方法使用的是纯原生的js写法
另外,也可以借助于 vue.js
暴漏的方法,将用 vue.js
语法写的指令或组件封装进来,在开发中有时就是使用这种方法,将一些特殊的功能封装成独立模块(像我们使用的Eelement-ui,Mint-ui等基于 vue.js
的库就是这样包装起来的),然后通过 Vue.use()
来引用。
注意:vue.js
插件的不同之处就是它结合 vue.js
自身的特性,可以将组件和指令这两个MVVM模块囊括进来。
vue.js
插件的实际应用
分析一下 Eelement-UI 组件库的 index.js
文件的代码:
/* Automatically generated by './build/bin/build-entry.js' */
// 引入各个基础组件模块
import Pagination from '../packages/pagination/index.js';
import Dialog from '../packages/dialog/index.js';
...
// 将引入的所有基础组件模块放在一个数组中,数组名为components,这样后面方便统一注册
const components = [
Pagination,
Dialog,
...
];
// 定义一个名字为install的 vue.js 插件
const install = function(Vue, opts = {}) {
...
// 遍历数组components,然后注册引入的所有组件
components.map(component => {
Vue.component(component.name, component);
});
...
// 给 vue.js 扩展自定义加载/消息提示/消息确认等小功能
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;
Vue.prototype.$ELEMENT = ELEMENT;
};
/* istanbul ignore if */
if (typeof window !== 'undefined' && window.Vue) {
install(window.Vue);
}
// 文件模块导出对象
module.exports = {
version: '2.3.7',
...
install, // 名为 install 的插件
CollapseTransition,
Loading,
...
};
module.exports.default = module.exports;
之所以,要将install插件和各个模块组件,都放在文件导出对象中,是为了按需引入组件苦衷的组件。
// 在应用仅引入loading,alert组件
import {Loading, Alert} from 'element-ui'
// 在本应用中全局注册所引入的组件
Vue.component(Loading.name, Loading)
Vue.component(Alert.name, Alert)
如果查看每个组件的出口文件源代码,会发现它们都被封装成为了一个 Vue.js
的插件,例如:”./element/packages/alert/” 目录下的 index.js
文件,代码如下:
import Alert from './src/main';
/* istanbul ignore next */
Alert.install = function(Vue) {
Vue.component(Alert.name, Alert);
};
export default Alert;
之所以,要利用ES6语法实现 ‘组建模块文件——>插件模块文件——>组件文件’ 这样 ‘转过来,变过去’ ,是为了应用的模块化,方便项目的管理。
然后,就是熟悉ES6的模块的import和export。可参考阮一峰的ECMAScript 6 入门
后续可能还会继续修改,也欢迎各位批评指正。有问题或者有其他想法的可以在我的GitHub上pr。