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调用WebService的示例
Apr 07 Javascript
dreamweaver 安装Jquery智能提示
Apr 02 Javascript
jQuery取得select选择的文本与值的示例
Dec 09 Javascript
通过正则表达式实现表单验证是否为中文
Feb 18 Javascript
javascript监听鼠标滚轮事件浅析
Jun 05 Javascript
js鼠标点击图片实现随机变换图片的方法
Feb 16 Javascript
提高Web性能的前端优化技巧总结
Feb 27 Javascript
VUE页面中加载外部HTML的示例代码
Sep 20 Javascript
解决vue 格式化银行卡(信用卡)每4位一个符号隔断的问题
Sep 14 Javascript
ES5 模拟 ES6 的 Symbol 实现私有成员功能示例
May 06 Javascript
Vue实现穿梭框效果
Sep 30 Javascript
JavaScript实现页面高亮操作提示和蒙板
Jan 04 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
星际争霸, 教主第一视角, ZvT经典龙蛇演义
2020/03/02 星际争霸
解决ajax+php中文乱码的方法详解
2013/06/09 PHP
thinkphp学习笔记之多表查询
2014/07/28 PHP
基于swoole实现多人聊天室
2018/06/14 PHP
Aster vs KG BO3 第三场2.19
2021/03/10 DOTA
TextArea设置MaxLength属性最大输入值的js代码
2012/12/21 Javascript
js判断背景图片是否加载成功使用img的width实现
2013/05/29 Javascript
JQuery中$(document)是什么意思有什么作用
2014/07/21 Javascript
JS实现的鼠标跟随代码(卡通手型点击效果)
2015/10/26 Javascript
JavaScript中的跨浏览器事件操作的基本方法整理
2016/05/20 Javascript
JavaScript中的各种操作符使用总结
2016/05/26 Javascript
JavaScript制作颜色反转小游戏
2016/09/25 Javascript
几种响应式文字详解
2017/05/19 Javascript
vue小图标favicon不显示的解决方案
2017/09/19 Javascript
JS简单添加元素新节点的方法示例
2018/02/10 Javascript
微信小程序表单验证form提交错误提示效果
2020/06/19 Javascript
在vue中使用vue-echarts-v3的实例代码
2018/09/13 Javascript
微信小程序基于picker实现级联菜单
2019/02/15 Javascript
vue下使用nginx刷新页面404的问题解决
2019/08/02 Javascript
Python创建文件和追加文件内容实例
2014/10/21 Python
Python的Flask框架应用程序实现使用QQ账号登录的方法
2016/06/07 Python
python实现Decorator模式实例代码
2018/02/09 Python
python查看模块安装位置的方法
2018/10/16 Python
Django模板Templates使用方法详解
2019/07/19 Python
python编写简单端口扫描器
2019/09/04 Python
pytorch三层全连接层实现手写字母识别方式
2020/01/14 Python
基于tensorflow指定GPU运行及GPU资源分配的几种方式小结
2020/02/03 Python
详解python的super()的作用和原理
2020/10/29 Python
python爬虫基础之urllib的使用
2020/12/31 Python
jupyter notebook更换皮肤主题的实现
2021/01/07 Python
实例讲解CSS3中的border-radius属性
2015/08/18 HTML / CSS
公司员工离职证明书
2014/10/04 职场文书
乡镇保密工作承诺书
2015/05/04 职场文书
《风娃娃》教学反思
2016/02/18 职场文书
2016年“11.11”光棍节活动总结
2016/04/05 职场文书
Jupyter Notebook 如何修改字体和大小以及更改字体样式
2021/06/03 Python