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 自动填写表单的实现方法
Apr 09 Javascript
Javascript基础教程之数据类型 (字符串 String)
Jan 18 Javascript
jQuery向后台传入json格式数据的方法
Feb 13 Javascript
JS实现将Asp.Net的DateTime Json类型转换为标准时间的方法
Aug 02 Javascript
JS控制HTML元素的显示和隐藏的两种方法
Sep 27 Javascript
jQuery焦点图左右转换效果
Dec 12 Javascript
原生js和css实现图片轮播效果
Feb 07 Javascript
学习使用jQuery表单验证插件和日历插件
Feb 13 Javascript
JS正则获取HTML元素的方法
Mar 31 Javascript
JS滚动到指定位置导航栏固定顶部
Jul 03 Javascript
AngularJS实时获取并显示密码的方法
Feb 06 Javascript
JavaScript设计模式之单例模式原理与用法实例分析
Jul 26 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
Terran兵种对照表
2020/03/14 星际争霸
php中批量替换文件名的实现代码
2011/07/20 PHP
php 操作数组(合并,拆分,追加,查找,删除等)
2012/07/20 PHP
PHP生成各种常见验证码和Ajax验证过程
2016/01/10 PHP
web页面数据展示新想法(json)
2010/06/08 Javascript
jQuery之选择组件的深入解析
2013/06/19 Javascript
JavaScript中的对象与JSON
2015/07/03 Javascript
node.js连接mongoDB数据库 快速搭建自己的web服务
2016/04/17 Javascript
JS比较两个数值的大小实例
2016/11/25 Javascript
Vue.js实现按钮的动态绑定效果及实现代码
2017/08/21 Javascript
浅谈Vuex@2.3.0 中的 state 支持函数申明
2017/11/22 Javascript
React项目动态设置title标题的方法示例
2018/09/26 Javascript
vue移动端html5页面根据屏幕适配的四种解决方法
2018/10/19 Javascript
webpack打包非模块化js的方法
2018/10/24 Javascript
vue同个按钮控制展开和折叠同个事件操作
2020/07/29 Javascript
JS如何判断对象是否包含某个属性
2020/08/29 Javascript
vue 实现图片懒加载功能
2020/12/31 Vue.js
[01:35:53]完美世界DOTA2联赛PWL S3 Magma vs GXR 第二场 12.13
2020/12/17 DOTA
Python环境变量设置方法
2016/08/28 Python
浅谈numpy数组的几种排序方式
2017/12/15 Python
解决PyCharm的Python.exe已经停止工作的问题
2018/11/29 Python
Python 实现王者荣耀中的敏感词过滤示例
2019/01/21 Python
Python restful框架接口开发实现
2020/04/13 Python
如何实现更换Jupyter Notebook内核Python版本
2020/05/18 Python
浅析python 通⽤爬⾍和聚焦爬⾍
2020/09/28 Python
Shopee菲律宾:在线购买和出售
2019/11/25 全球购物
简历中自我评价怎么写
2014/02/12 职场文书
幼儿园中班教师寄语
2014/04/03 职场文书
经管应届生求职信范文
2014/05/18 职场文书
酒店管理专业自荐信
2014/05/23 职场文书
应届生求职信
2014/05/31 职场文书
环保志愿者活动方案
2014/08/14 职场文书
2014年党员自我评议总结
2014/09/23 职场文书
家长对孩子的寄语
2015/02/26 职场文书
员工辞职信范文
2015/03/02 职场文书
2019暑假学生安全口号
2019/06/27 职场文书