Vue中如何定义全局的变量和常量(转)/a/1190000010168571ui设计师就业前景
Vue 中如何定义全局的变量和常量
vue.js
javascript
17.6k 次阅读 · 读完需要 10 分钟
7
Vue 中如何定义全局的变量和常量
我想要定义⼀个变量, 在项⽬的任何地⽅都可以访问到, 不需要每⼀次使⽤的时候, 都引⼊.
尝试1:
aggressive
创建 global.js 并且在其中定义
let a = 10;
在⼊⼝⽂件中引⼊ global.js
import './global.js'
在项⽬中使⽤:
a// 报错
发现报错了, a 并没有定义. 为什么?
这个涉及到模块作⽤域:
1 每⼀个 js 都相当于⼀个模块, ⼀个模块有⾃⼰的模块作⽤域.
意思就是说: 其中的变量⽅法, 都只在这个模块上⾯⽣效.
尝试2:
将变量放到 Vue.prototype 上⾯, 通过插件全局引⼊
创建 global.js, 这样写:square heart
leta =10;exportdefault{ install () { Vue.prototype.$a = a; }}
在 ⼊⼝⽂件中引⼊:
importGfrom'./global'Vue.u(G);
在项⽬中使⽤:
this.$a
的确可以, 但是这样的⽅式并不好, 在任何 this 不指向 Vue 的地⽅, 你都没有办法使⽤这个变量.尝试3:
将变量放到 window 对象上⾯
创建 global.js
window.a = 10;
在⼊⼝⽂件中引⼊
import './global.js'
在项⽬中使⽤:
a
可⾏, 这种⽅式只要你能访问到 window 对象, 就能访问到这个变量.
有什么缺点吗?
暂时没有发现.
实际的场景分析:
2014山东高考英语
在实际情景上, 你可能拥有⼀份配置, ⽐如说微信公众号开发的时候, 你有⼀份配置, 写着
appId 和 appKey, 希望可以全局访问到.
按照上⾯的讨论, 你应该这么写:
global.js
window.appId =123;window.appKey ='abc';
可以很明显的看到, ⼀旦你要定义的变量或者常量过多, 就能疯了.
所以我们希望有⼀种⽅式, 我们定义还是按照⾃⼰的⽅式定义:
圣诞节快乐的英语appId=123;appKey='abc';
然后有⼀个⽅法fn, 可以将这两个参数, 直接绑定到 window 对象上⾯
fn (appId, appKey);makebelieve
结果就是 appId, appKey 都会被绑定到 window 对象上⾯.
实现:
你需要传递⼀个对象给⽅法 fn, fn 负责将这个对象中的每⼀个 key 都绑定到 window 对象上⾯. letbindToGlobal =obj=>{for(letkeyinobj) {window[key] = obj[key] }}
更新版本:
你这样⽤之后, 所有的变量/常量都绑定在 window 对象上⾯, 很容易就和已经存在 window 对象上⾯的变量
edge网络是什么
冲突, 所以要收敛你的⾏为, 这样:
你先在window 对象上⾯设置⼀个属性, 属性值是⼀个对象, ⽐如这样:
window.key = {};
然后将你所有需要设置的全局变量, ⽅法, 都放到 window.key ⾥⾯⽽不是 window 上⾯.
letbindToGlobal =obj=>{window.abc = {};for(letkeyinobj) {window.abc[key] = obj[key] }}
更近⼀步, 可以让这个 key 的名字为 _const 或者 _var, 或者让⽤户⾃⼰控制这个变量的名字.
letbindToGlobal =(obj, key='var') =>{window[key] = {};for(letiinobj) {window[key][i] = obj[i] }}
现在⼤致已经可以了, 然后你要解决⼀下, 如果重复调⽤ 'bindToGlobal' 后⾯的会覆盖掉前⾯
所定义的 变量/常量, ⽽我们要的是 追加, 不是覆盖, 所以代码做个调整:
letbindToGlobal =(obj, key='var') =>{if(typeofwindow[key] ==='undefined') {window[key] = {}; }for(letiinobj) {window[key][i] = obj[i] }}
到这⾥已经结束了.
最后对 'bindToGlobal' 做⼀个修改, 使得你以后使⽤的时候⽐较简单⽅便⼀点
讨论⼀下:
虽然开放了绑定在 window 对象上⾯的对象的名字, 但是你是不是就可以随便起名字?
假设你有两份配置, 都是常量,
⼀份是 http.js, 配置了全局请求的域名
可能的英语⼀份是 wexin.js 配置了公众号⾥⾯的⼀些 appId, appkey
你是这样绑定呢:
bindToGlobal(http, '_http');bindToGlobal(wexin, '_wexin');
这样访问:
_http.host_wexin.appId
nwe>gex还是按照它是常量还是变量去绑定:
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, 多简单的事情.