Vue中定义全局变量与常量的各种方式详解


Posted in Javascript onAugust 23, 2017

前言

本文主要跟大家介绍了关于Vue定义全局变量与常量的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍:

我想要定义一个变量, 在项目的任何地方都可以访问到, 不需要每一次使用的时候, 都引入.

尝试1:

创建 global.js 并且在其中定义

let a = 10;

在入口文件中引入 global.js

import './global.js'

在项目中使用:

a // 报错

发现报错了, a 并没有定义. 为什么?

这个涉及到模块作用域:

1 每一个 js 都相当于一个模块, 一个模块有自己的模块作用域.

意思就是说: 其中的变量方法, 都只在这个模块上面生效.

尝试2:

将变量放到 Vue.prototype 上面, 通过插件全局引入

创建 global.js, 这样写:

let a = 10;
export default {
 install () {
 Vue.prototype.$a = a;
 }
}

在 入口文件中引入:

import G from './global'
Vue.use(G);

在项目中使用:

this.$a

的确可以, 但是这样的方式并不好, 在任何 this 不指向 Vue 的地方, 你都没有办法使用这个变量.

尝试3:

将变量放到 window 对象上面

创建 global.js

window.a = 10;

在入口文件中引入

import './global.js'

在项目中使用:

a

可行, 这种方式只要你能访问到 window 对象, 就能访问到这个变量.

有什么缺点吗?

暂时没有发现.

实际的场景分析:

在实际情景上, 你可能拥有一份配置, 比如说微信公众号开发的时候, 你有一份配置, 写着

appId 和 appKey, 希望可以全局访问到.

按照上面的讨论, 你应该这么写:

global.js

window.appId = 123;
window.appKey = 'abc';

可以很明显的看到, 一旦你要定义的变量或者常量过多, 就能疯了.

所以我们希望有一种方式, 我们定义还是按照自己的方式定义:

appId = 123;
appKey = 'abc';

然后有一个方法fn, 可以将这两个参数, 直接绑定到 window 对象上面

fn (appId, appKey);

结果就是 appId, appKey 都会被绑定到 window 对象上面.

实现:

你需要传递一个对象给方法 fn, fn 负责将这个对象中的每一个 key 都绑定到 window 对象上面.

let bindToGlobal = obj => {
 for (let key in obj) {
 window[key] = obj[key]
 }
}

更新版本:

你这样用之后, 所有的变量/常量都绑定在 window 对象上面, 很容易就和已经存在 window 对象上面的变量冲突, 所以要收敛你的行为, 这样:你先在window 对象上面设置一个属性, 属性值是一个对象, 比如这样:

window.key = {};

然后将你所有需要设置的全局变量, 方法, 都放到 window.key 里面而不是 window 上面.

let bindToGlobal = obj => {
 window.abc = {};
 for (let key in obj) {
 window.abc[key] = obj[key]
 }
}

更近一步, 可以让这个 key 的名字为 _const 或者 _var, 或者让用户自己控制这个变量的名字.

let bindToGlobal = (obj, key='var') => {
 window[key] = {};
 for (let i in obj) {
 window[key][i] = obj[i]
 }
}

现在大致已经可以了, 然后你要解决一下, 如果重复调用 'bindToGlobal' 后面的会覆盖掉前面所定义的 变量/常量, 而我们要的是 追加, 不是覆盖, 所以代码做个调整:

let bindToGlobal = (obj, key='var') => {
 if (typeof window[key] === 'undefined') {
 window[key] = {};
 }
 
 for (let i in obj) {
 window[key][i] = obj[i]
 }
}

到这里已经结束了.

最后对 'bindToGlobal' 做一个修改, 使得你以后使用的时候比较简单方便一点

讨论一下:

虽然开放了绑定在 window 对象上面的对象的名字, 但是你是不是就可以随便起名字?

假设你有两份配置, 都是常量,

一份是 http.js, 配置了全局请求的域名

一份是 wexin.js 配置了公众号里面的一些 appId, appkey

你是这样绑定呢:

bindToGlobal(http, '_http');
bindToGlobal(wexin, '_wexin');

这样访问:

_http.host 
_wexin.appId

还是按照它是常量还是变量去绑定:

bindToGlobal(httpConfig, '_const');
bindToGlobal(wexin, '_const');

这样访问:

_const.host;
_const.appId;

前者语义上面肯定是优秀的, 但是我考虑的不是这么一个点:

1 、如果有新人要来维护你的代码, 他想访问一个常量, 要先知道你定义的常量的名字是什么, 比如知道了是 'wexin', 然后再知道那个变量的名字是啥, 比如说 appId, 这个时候才能访问:

wexin.appId;

而如果你统一都是用 '_const', 他只要去配置文件里面看下名字是 appId, 就可以这么用

_const.appId; // over

也就是说 牺牲语义, 换来维护简单一点.

试想如果追求语义, 你分的非常细, 定了七八个 key。

2、记忆上面的问题, 未来的你, 放了几个月再来维护的时候, 或者某天你搞这个项目都搞的要吐了, 新访问一个变量的时候, 还要想一下 key 名字, 怂.

而统一 _const.appId, 多简单的事情.

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
Javascript 实现图片无缝滚动
Dec 19 Javascript
JS实现点击按钮后框架内载入不同网页的方法
May 05 Javascript
JavaScript基本的输出和嵌入式写法教程
Oct 20 Javascript
实例代码详解javascript实现窗口抖动及qq窗口抖动
Jan 04 Javascript
jQuery的Cookie封装,与PHP交互的简单实现
Oct 05 Javascript
Vue.js Ajax动态参数与列表显示实现方法
Oct 20 Javascript
vue如何解决循环引用组件报错的问题
Sep 22 Javascript
学习node.js 断言的使用详解
Mar 18 Javascript
JavaScript模块管理的简单实现方式详解
Jun 15 Javascript
jQuery实现每日秒杀商品倒计时功能
Sep 06 jQuery
html-webpack-plugin修改页面的title的方法
Jun 18 Javascript
Javascript表单序列化原理及实现代码详解
Oct 30 Javascript
基于JavaScript实现带数据验证和复选框的表单提交
Aug 23 #Javascript
使用JS组件实现带ToolTip验证框的实例代码
Aug 23 #Javascript
利用Vue实现移动端图片轮播组件的方法实例
Aug 23 #Javascript
详解AngularJS跨页面传值(ui-router)
Aug 23 #Javascript
vue中页面跳转拦截器的实现方法
Aug 23 #Javascript
jquery.rotate.js实现可选抽奖次数和中奖内容的转盘抽奖代码
Aug 23 #jQuery
Angular2+国际化方案(ngx-translate)的示例代码
Aug 23 #Javascript
You might like
php懒人函数 自动添加数据
2011/06/28 PHP
PHP数据流应用的一个简单实例
2012/09/14 PHP
编辑浪子版表单验证类
2007/05/12 Javascript
Ext 表单布局实例代码
2009/04/30 Javascript
用JS写的一个TableView控件代码
2010/01/23 Javascript
基于jQuery的js分页代码
2010/06/10 Javascript
Javascript下判断是否为闰年的Datetime包
2010/10/26 Javascript
突发奇想的一个jquery插件
2010/11/19 Javascript
jquery上传插件fineuploader上传文件使用方法(jquery图片上传插件)
2013/12/05 Javascript
iPhone手机上搭建nodejs服务器步骤方法
2015/07/06 NodeJs
jQuery实现元素拖拽并cookie保存顺序的方法
2016/02/20 Javascript
JavaScript几种数组去掉重复值的方法推荐
2016/04/12 Javascript
js基础之DOM中元素对象的属性方法详解
2016/10/28 Javascript
微信小程序 wxapp内容组件 progress详细介绍
2016/10/31 Javascript
ES6新特性六:promise对象实例详解
2017/04/21 Javascript
echarts学习笔记之图表自适应问题详解
2017/11/22 Javascript
在 Linux/Unix 中不重启 Vim 而重新加载 .vimrc 文件的流程
2018/03/21 Javascript
json字符串传到前台input的方法
2018/08/06 Javascript
JavaScript JSON数据处理全集(小结)
2019/08/15 Javascript
layer的prompt弹出框,点击回车,触发确定事件的方法
2019/09/06 Javascript
Javascript类型判断相关例题及解析
2020/08/26 Javascript
使用Python装饰器在Django框架下去除冗余代码的教程
2015/04/16 Python
python编程嵌套函数实例代码
2018/02/11 Python
给大家整理了19个pythonic的编程习惯(小结)
2019/09/25 Python
增大python字体的方法步骤
2020/07/05 Python
Python descriptor(描述符)的实现
2020/11/15 Python
CSS3实现伪类hover离开时平滑过渡效果示例
2017/08/10 HTML / CSS
Canvas 帧动画吃苹果小游戏
2020/08/05 HTML / CSS
爱他美官方海外旗舰店:Aptamil奶粉
2017/12/22 全球购物
连卡佛中国官网:Lane Crawford中文站
2018/01/27 全球购物
荷兰领先的百货商店:De Bijenkorf
2018/10/17 全球购物
仓库主管的岗位职责
2013/12/04 职场文书
大学生冰淇淋店商业计划书
2014/01/14 职场文书
商务代表岗位职责
2015/02/15 职场文书
暑假安全保证书
2015/02/28 职场文书
教师自荐信范文
2015/03/06 职场文书