vue 怎么全局到入常量_Vue 中如何定義全局的變量和常量(轉)

17.6k 次閱讀 ?·? 讀完需要 10 分鐘

7

Vue 中如何定義全局的變量和常量

我想要定義一個變量, 在項目的任何地方都可以訪問到, 不需要每一次使用的時候, 都引入.

嘗試1:

創建 global.js 并且在其中定義

let?a =?10;

在入口文件中引入 global.js

import?'./global.js'

在項目中使用:

a// 報錯

發現報錯了, a 并沒有定義. 為什么?

這個涉及到模塊作用域:

1 每一個 js 都相當于一個模塊, 一個模塊有自己的模塊作用域.

意思就是說: 其中的變量方法, 都只在這個模塊上面生效.

嘗試2:

將變量放到 Vue.prototype 上面, 通過插件全局引入

創建 global.js, 這樣寫:

leta =10;exportdefault{? ? install () {? ? ? ? Vue.prototype.$a = a;? ? }}

在 入口文件中引入:

importGfrom'./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 對象上面.

letbindToGlobal =obj=>{for(letkeyinobj) {window[key] = obj[key]? ? }}

更新版本:

你這樣用之后, 所有的變量/常量都綁定在 window 對象上面, 很容易就和已經存在 window 對象上面的變量

沖突, 所以要收斂你的行為, 這樣:

你先在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

還是按照它是常量還是變量去綁定:

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, 多簡單的事情.

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/534098.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/534098.shtml
英文地址,請注明出處:http://en.pswp.cn/news/534098.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

revit找不到附加模塊程序集_TensorFlow基礎知識——常用模塊(一)

1本節簡述對于開展深度學習開發的目標而言,我們需要掌握的除了必要的深度學習理論基礎、必要的開發依賴庫基礎知識、基本的開發套路之外,我們還需要掌握它常見的外圍小幫手都有哪些。這些小幫手就是深度學習依賴庫中的其他并不是核心的模塊,但…

android搭建opencv開發環境,Android Studio搭建opencv開發環境

文章不配圖片,閱讀需要有Android開發基礎并熟悉Android Studio。一、搭建基于Java開發環境以下內容介紹如何搭建基于Java jni的opencv開發環境。1、準備工作從opencv官網下載Android平臺開發sdk并解壓,假設解壓后文件夾名為opencv-4.3.0-android-sdk。(此…

99 網絡編程_網絡工程師技能圖譜,看看你會多少技能

技術推動了時代變革,互聯網則加速了這場變革。在蓬勃發展的互聯網浪潮下,網絡作為基礎設施的關鍵紐帶保障著網路流量的順利流通,維持著賽博世界的繁榮。而在這繁榮之下,生存著這樣一個群體——網絡工程獅,為網絡紐帶保…

python 3.8.0安卓_Python for Mac v3.8.0 官方最新版

Python for Mac是一款全新推出的編程工具,所有 python.org macOS 安裝程序都附帶了 OpenSSL 的內置副本。此外,還有一個針對 macOS 10.9 的新增安裝程序變體,其中包含 Tcl / Tk 8.6的內置版本,有需要的朋友快來下載試試吧!Python …

線程join_Java 并發編程:線程間的協作(wait/notify/sleep/yield/join)

點擊上方“Coder編程”,選擇“置頂公眾號”技術文章第一時間送達!并發編程.png每天進步一點,不做curd工程師與Api調用工程師 歡迎訪問個人博客網站:https://www.coder-programming.cn/ 作者:liuxiaopeng | http://www…

4位先行進位電路 logisim_你真的了解74系列集成電路嗎?讓我幫你總結一下

74系列集成電路大致可分為6大類:74(標準型)74LS(低功耗肖特基)74S(肖特基)74ALS(先進低功耗肖特基)74AS(先進肖特基)74F(高速)HC為COMS工作電平;HCT為TTL工作電平,可與74LS系列互換使用HCU適用于無緩沖級的CMOS電路。這9種74系列產品&#xf…

android ios av tv,iOS使用AVPlayer制作戰旗TvDEMO OC版

在視頻教學中看到一個別人寫的戰旗TvDEMO寫得很好,于是自己動手試著制作一個。效果如下圖所示主界面豎屏播放橫屏播放點擊出現工具欄視頻播放使用的是AVPlayer,具體的使用方式如下//---PlayView---_playView [[UIView alloc]init];_playView.frame CGRectMake(0, …

matlab 子圖title的位置_matlab 畫圖基本介紹

1.在命令窗口輸入命令時&#xff0c;可以不必每輸入一條命令就按enter鍵執行&#xff0c;可以在輸入幾行后一同運行。方法是&#xff1a;換行時&#xff0c;只要在按住<shift>鍵的同時按<enter>鍵即可&#xff0c;否則matlab就會執行上面輸入的所有語句。2.如何將數…

python程序打包成安卓app教程_Python打包方法基本應用方式介紹

Python編程語言是一款功能強大的免費開源的通用型計算機程序應用語言&#xff0c;對于經驗豐富的開發人員來說&#xff0c;掌握這樣一款語言在其程序開發中是一個比較重要的選擇。我們今天就先來了解一下python打包方法的相關應用。 一、簡介 py2exe是一個將Python腳本轉換成wi…

android添加刪除項目,編寫android計算器添加刪除按鈕,出現很抱歉,XX項目已停止運行。...

這是刪除按鈕監聽代碼&#xff1a;//del 按鈕的監聽btnDel (Button) findViewById(R.id.delete);btnDel.setOnClickListener(new OnClickListener() {Overridepublic void onClick(View view) {btnDel.setOnClickListener(this);//短按//btnDel.setOnLongClickListener(this);…

二元一次方程有唯一解的條件_人教版初中數學七年級下冊用適當方法解二元一次方程組公開課優質課課件教案視頻...

解二元一次方程組---加減法一、教學目的&#xff1a;1&#xff0e;使學生掌握用加減法解二元一次方程組的步驟。2&#xff0e;熟練運用加減法解二元一次方程組。3&#xff0e;培養學生分析問題、解決問題的能力。二、教學重點、難點和關鍵&#xff08;一&#xff09;重點&#…

為什么從網頁上打印怎們好像被縮放_全網最詳細關于3D打印的zbrush技術

這個小教程旨在為剛開始對3D打印感興趣的新人朋友提供一些快速上手小技巧&#xff0c;以便在zbrush中制作適合桌面FDM 3D打印的創作&#xff0c;本次小教程需要讀者已經有一些zbrush基礎知識。1設置系統單位導入1英尺的box&#xff0c;1英尺X1英尺X1英尺。一旦導入到場景中&…

android圖片瀏覽遠近,快圖瀏覽編輯圖片方法介紹_怎么編輯圖片_3DM手游

既然是圖片管理工具&#xff0c;那么快圖瀏覽肯定也是少不了圖片編輯功能的。如何使用快圖瀏覽編輯圖片呢&#xff1f;下面小編帶來的詳細的使用方法&#xff0c;有需要的小伙伴一起來看看吧&#xff01;編輯照片方法介紹&#xff1a;1.第一步&#xff0c;下載安裝快圖瀏覽&…

h5微信本地調試 vue_vueh5中使用微信sdk

微信官方sdk教程安裝vue 微信sdk 使用NPM安裝&#xff0c;不會的百度學npm install jweixin-module --save創建一個wxsdk.js 文件// 引入微信sdkvar jweixin require(jweixin-module);export default {//判斷是否在微信中isWechat: function() {var ua window.navigator.user…

matlab 三維 作圖 坐標軸_MATLAB學習——MATLAB中的三維繪圖指令

2 基本XYZ立體繪圖命令mesh和plot是三度空間立體繪圖的基本命令&#xff0c;mesh可畫出立體網狀圖&#xff0c;plot則可畫出立體曲面圖&#xff0c;兩者產生的圖形都會依高度而有不同顏色。下列命令可畫出由函數形成的立體網狀圖: xlinspace(-2, 2, 25); % 在x軸上取25點 ylins…

說說python程序的執行過程_表示說的詞語

展開全部1、奉勸 [ fng qun ] 釋義&#xff1a;敬辭。鄭重勸說62616964757a686964616fe58685e5aeb931333365653331。 造句&#xff1a;我們厭惡那些陰險的惡人&#xff0c;奉勸他們改惡為善&#xff0c;才能得到社會的原諒&#xff01; 2、勸告 [ qun go ] 釋義&#xff1a;拿道…

HTML4基本編譯原理,Stanford公開課《編譯原理》學習筆記(1~4課)

課程里涉及到的內容講的還是很清楚的&#xff0c;但個別地方有點脫節&#xff0c;任何看不懂卡住的地方&#xff0c;請自行查閱經典著作《Compilers——priciples, Techniques and Tools》(也就是大名鼎鼎的龍書)的對應章節。一. 編譯的基本流程完整的編譯的5個基本步驟包括lex…

rocketmq 消息指定_SpringBoot 整合 RocketMQ 如何實現消息生產消費?

有時候我們在使用消息隊列的時候&#xff0c;往往需要能夠保證消息的順序消費&#xff0c;而RocketMQ是可以支持消息的順序消費的。RocketMQ在發送消息的時候&#xff0c;是將消息發送到不同的隊列中&#xff0c;然后消費端從多個隊列中讀取消息進行消費&#xff0c;很明顯&…

mysql怎么看實例名_南方“中看不中吃”的前4名水果,蓮霧只是墊底,你怎么看?...

水果很多人都喜歡吃&#xff0c;南方人可以說是最幸福的&#xff0c;因為南方的水果種類有很多種&#xff0c;而且水果的價格也很便宜&#xff0c;一年四季都能吃到便宜又好吃的水果&#xff0c;南方的很多水果&#xff0c;北方人可能都沒有吃過&#xff0c;雖然南方的水果種類…

html頁面怎么加向下滾動,如何使用jQuery向上或向下滾動頁面到錨點?

如何使用jQuery向上或向下滾動頁面到錨點&#xff1f;我正在尋找一種方法來包含幻燈片效果&#xff0c;當您單擊頁面上或下的本地錨點鏈接時。我想要一個你有這樣一個鏈接的東西&#xff1a;link text, img etc.也許添加了一個類&#xff0c;所以你知道你希望這個鏈接是一個滑動…