如何在 Vue.js 中使用第三方js库
在诸多 Vue.js 应用中,Lodash,Moment,Axios,Async等都是一些非常有用的 JavaScript 库. 但随着项目越来越复杂,可能会采取组件化和模块化的方式来组织代码,还可能要使应用支持不同环境下的服务端渲染. 除非你找到了一个简单而又健壮的方式来引入这些库供不同的组件和模块使用,不然,这些第三方库的管理会给你带来一些麻烦. 本文将介绍一些在 Vue.js 中使用第三方库的方式. 全局变量在项目中添加第三方库的最简单方式是讲其作为一个全局变量,挂载到 window 对象上: entry.js MyComponent.vue 这种方式不适合于服务端渲染,因为服务端没有 window 对象,是 undefined,当试图去访问属性时会报错. 在每个文件中引入另一个简单的方式是在每一个需要该库的文件中导入: MyComponent.vue export default {
created() { console.log(_.isEmpty() ? 'Lodash is available here!' : 'Uh oh..'); } } 这种方式是允许的,但是比较繁琐,并且带来的问题是: 你必须记住在哪些文件引用了该库,如果项目不再依赖这个库时,得去找到每一个引用该库的文件并删除该库的引用. 如果构建工具没设置正确,可能导致该库的多份拷贝被引用. 优雅的方式在 Vuejs 项目中使用 JavaScript 库的一个优雅方式是讲其代理到 Vue 的原型对象上去. 按照这种方式,我们引入 entry.js 由于所有的组件都会从 Vue 的原型对象上继承它们的方法,因此在所有组件/实例中都可以通过 this.$moment: 的方式访问 Moment 而不需要定义全局变量或者手动的引入. MyNewComponent.vue 接下来就了解下这种方式的工作原理. Object.defineProperty一般而言,可以按照下面的方式来给对象设置属性: 可以这样做,但是 Object.defineProperty 允许我们通过一个 descriptor 来定义属性. Descriptor 运行我们去设置对象属性的一些底层(low-level)细节,如是否允许属性可写? 是否允许属性在 for 循环中被遍历. 通常,我们不会为此感到困扰,因为大部分时候,对于属性赋值,我们不需要考虑这样的细节. 但这有一个明显的优点: 通过 descriptor 创建的属性默认是只读的 . 这就意味着,一些处于迷糊状态的(coffee-deprived)开发者不能在组件内去做一些很愚蠢的事情,就像这样: 此外,试图给只读实例的方法重新赋值会得到 $你可能会注意到,代理第三库的属性会有一个 这个不是强制要求,给属性添加 this你还可能注意到,在组件内是通过 {
if (res.status !== 200) {
this.$http.get('/') // etc
// Only works in a fat arrow callback.
}
});
插件如果你想在多个项目中使用同一个库,或者想将其分享给其他人,可以将其写成一个插件: 在应用的入口引入插件之后,就可以在任何一个组件内像使用 Vue Router,Vuex 一样使用你定义的库了. 写一个插件首先,创建一个文件用于编写自己的插件. 在示例中,我会将 Axios 作为插件添加到项目中,因而我给文件起名为 axios.js . 其次,插件要对外暴露一个 install 方法,该方法的第一个参数是 Vue 的构造函数: axios.js 可以使用先前将库添加到原型对象上的方法: axios.js export default {
install: function(Vue,) { Object.defineProperty(Vue.prototype,'$http',{ value: axios }); } } 最后,利用 Vue 的实例方法 use 将插件添加到项目中: entry.js new Vue({
created() { console.log(this.$http ? 'Axios works!' : 'Uh oh..'); } }) 彩蛋: 插件的可选参数插件的 install 方法可以接受可选参数. 一些开发可能不喜欢将 Axios 实例命名为 $http,因为这是 Vue Resource 提供的一个通用名字. 因而可以提供一个可选的参数允许他们随意命名: axions.js export default {
install: function(Vue,name = '$http') { Object.defineProperty(Vue.prototype,name,{ value: axios }); } } entry.js import AxiosPlugin from './axios.js'; new Vue({ 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程之家。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |