uni-app 全局變量的使用

全局變量

目錄:

  1. 通過(guò)js文件實(shí)現(xiàn)
  2. 通過(guò)Vue.prototype來(lái)實(shí)現(xiàn)
  3. globalData
  4. 通過(guò)Vuex實(shí)現(xiàn)

1跋核、通過(guò)js文件實(shí)現(xiàn)

創(chuàng)建一個(gè)js文件兢卵,如:global.js量淌,假設(shè)我們需要一個(gè)能夠在全局訪問(wèn)的data對(duì)象爽哎,我們可以這樣寫(xiě):

var data = {}

function setData(obj){
    data = obj
}

function getData(isCopy = false) {
    if (!isCopy) {
        return data
    }
    return JSON.parse(JSON.stringify(data))
}

module.exports = {
    setData: setData,
    getData: getData
}

個(gè)人是建議寫(xiě)成set和get函數(shù)的方式來(lái)設(shè)置和獲取data變量姐帚,不建議直接將data暴露給外部渣窜。

外部vue文件想訪問(wèn)data铺根,導(dǎo)入js文件即可:

<script>
  /// 導(dǎo)入js文件,這里用的是相對(duì)路徑
    import global from "../../common/js/global.js"

    export default {
        onShow:function(){
      // 調(diào)用setData函數(shù)乔宿,可以設(shè)置data的值
            global.setData({'name': 'diudiu'})
      // 調(diào)用getData函數(shù)位迂,可以拿到data的值
            var data = global.getData()
            console.log(data)
        }
    }
</script>

外部js文件想要訪問(wèn)data,同理只要導(dǎo)入路徑详瑞。

import global from './global.js'

function testMethod(){
    var data = global.getData()
    console.log(data)
}

module.exports = {
    testMethod: testMethod
}

這種方式的缺點(diǎn)是每一個(gè)使用的地方都需要導(dǎo)入頭文件掂林。

2、通過(guò)Vue.prototype來(lái)實(shí)現(xiàn)

注: .vue 和 .nvue 并不是一個(gè)規(guī)范坝橡,因此一些在 .vue 中適用的方案并不適用于 .nvue泻帮。 Vue 上掛載屬性,不能在 .nvue 中使用计寇。

1锣杂、直接掛載

一些常用的使用頻次高的函數(shù)和屬性脂倦,我們可以直接掛載到Vue.prototype上

在 main.js 中掛載屬性/方法:

/// 掛載屬性
Vue.prototype.data = {
    name: 'diudiu'
}

/// 掛載函數(shù)
Vue.prototype.log = function(){
    console.log('......')
}

在vue文件中使用:

<script>
    export default {
        onShow:function(){
      /// 訪問(wèn)屬性
            var data = this.data
            console.log(data)
      /// 調(diào)用方法
      this.log()
        }
    }
</script>

控制臺(tái)輸出:

{name: "diudiu"}
......

但是不建議掛載直接寫(xiě)屬性名和函數(shù)名,因?yàn)檫@樣如果vue中也有同名的屬性和函數(shù)時(shí)元莫,vue中訪問(wèn)的就是自己的屬性和函數(shù)赖阻。所以我們一般使用Vue.prototype掛載屬性和函數(shù)時(shí)會(huì)在前面加上$前綴。上面的代碼改造如下:

Main.js中

/// 掛載屬性
Vue.prototype.$dataObj = {
    name: 'diudiu'
}

/// 掛載函數(shù)
Vue.prototype.$log = function(){
    console.log('......')
}

vue文件中調(diào)用:

<script>
    export default {
        onShow:function(){
      /// 訪問(wèn)屬性
            var data = this.$dataObj
            console.log(data)
      /// 調(diào)用方法
      this.$log()
        }
    }
</script>
2柒竞、掛載js文件

通過(guò)Vue.prototype屬性函數(shù)一個(gè)一個(gè)的掛載上去政供,最后main.js會(huì)顯得很臃腫,而且不好維護(hù)朽基。我們可以按需將他們抽離出來(lái)分別封裝到對(duì)應(yīng)的js文件中布隔,以上文的global.js為例,在main.js中直接掛載global.js

/// 導(dǎo)入js文件
import global from 'common/js/global.js'
/// 掛載
Vue.prototype.$global = global

在vue文件中使用

<script>
    export default {
        data() {
            return {
                
            }
        },
        onShow:function(){
      /// 調(diào)用global中的setData函數(shù)
            this.$global.setData({name:'diudiu'})
      /// 調(diào)用global中的getData函數(shù)
            var data = this.$global.getData()
            console.log(data)
        }
    }
</script>

通過(guò)Vue.prototype方式優(yōu)點(diǎn)是不需要在使用的地方導(dǎo)入路徑稼虎,缺點(diǎn)是該方式只在vue文件中通用衅檀,在js文件中不生效。

3霎俩、globalData

小程序中有globalData的概念哀军,我們可以在App.vue文件中設(shè)置globalData

<script>
    export default {
        globalData:{
            name:'diudiu',
            logString:function(str){
                console.log(str)
            }
        },
        onLaunch: function() {
            
        },
        onShow: function() {
            
        },
        onHide: function() {
            
        }
    }
</script>

這里我們?cè)O(shè)置了一個(gè)屬性:name打却,一個(gè)函數(shù):logString杉适。在js文件或者vue文件中,我們可以通過(guò)getApp().globalData來(lái)拿到它柳击。代碼如下:

var global = getApp().globalData
var name = global.name
global.logString('name: ' + name)

/// 控制臺(tái)輸入如下:
/// name: diudiu

  • 如果你需要在App.vue中使用globalData猿推,不能通過(guò)getApp().globalData方式來(lái)獲取。

  • App.vue需使用this.$options.globalData來(lái)獲取globalData捌肴,代碼示例如下:

    • <script>
        export default {
            globalData:{
                name:'diudiu',
                logString:function(str){
                    console.log(str)
                }
            },
            onShow: function() {
                console.log(this.$options.globalData)
            }
        }
      </script>
      

4蹬叭、通過(guò)Vuex實(shí)現(xiàn)

我們某一個(gè)頁(yè)面vue文件的計(jì)算型屬性模塊引用了上述方法定義的全局變量時(shí),當(dāng)變量發(fā)生改變時(shí)并不能及時(shí)的反饋在當(dāng)前頁(yè)面中状知。舉個(gè)例子:

<template>
    <view >
        <button type="default" @click="buttonClick">點(diǎn)擊修改name</button>
            <text>{{ name }}</text>
    </view>
</template>

<script>
  export default {
    computed: {
            name(){
                return getApp().globalData.name
            }
        },
    method:{
      buttonClick: function(){
        getApp().globalData.name = '張三'
      }
    }
  }
</script>

點(diǎn)擊按鈕觸發(fā)buttonClick函數(shù)秽五,全局變量globalData.name值實(shí)際上被修改了,但是界面上展示的name還是之前的值饥悴,并不會(huì)被刷新坦喘。需要界面實(shí)時(shí)刷新,可以考慮使用Vuex的方式實(shí)現(xiàn)铺坞。

1起宽、創(chuàng)建相關(guān)目錄和文件

在工程根目錄下創(chuàng)建store文件夾,并在store文件夾下創(chuàng)建index.js文件济榨。js文件內(nèi)容如下:

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)

const store = new Vuex.Store({  
    state: {  
        name: '李四'
    },  
    mutations: {
            modifyUserName(state){
                state.name = '張三'
            }
    }
})

export default store
2赴涵、掛載

main.js文件中

import store from './store'
Vue.prototype.$store = store

Vue.config.productionTip = false
App.mpType = 'app'

const app = new Vue({
    store,
  ...App
})
app.$mount()
使用

此時(shí)改造下第一步中的vue文件代碼

<template>
    <view >
        <button type="default" @click="buttonClick">點(diǎn)擊修改name</button>
            <text>{{ name }}</text>
    </view>
</template>

<script>
  import {mapState, mapMutations} from 'vuex'
  export default {
    computed: {
            ...mapState(['name'])
        },
    method:{
      ...mapMutations(['modifyUserName']),
      buttonClick: function(){
        this.modifyUserName()
      }
    }
  }
</script>

此時(shí)价捧,點(diǎn)擊按鈕修改name之后擦剑,界面展示的文字也會(huì)發(fā)生改變。對(duì)比前面的方式磁餐,該方式更加適合處理全局的并且值會(huì)發(fā)生變化的情況。

關(guān)于vuex更詳細(xì)的語(yǔ)法和用法筋岛,請(qǐng)參考教程:地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末茫孔,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子库车,更是在濱河造成了極大的恐慌巨柒,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柠衍,死亡現(xiàn)場(chǎng)離奇詭異洋满,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)珍坊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)牺勾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人阵漏,你說(shuō)我怎么就攤上這事驻民。” “怎么了履怯?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵回还,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我叹洲,道長(zhǎng)柠硕,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任疹味,我火速辦了婚禮仅叫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘糙捺。我一直安慰自己诫咱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布洪灯。 她就那樣靜靜地躺著坎缭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪签钩。 梳的紋絲不亂的頭發(fā)上掏呼,一...
    開(kāi)封第一講書(shū)人閱讀 51,370評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音铅檩,去河邊找鬼憎夷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛昧旨,可吹牛的內(nèi)容都是我干的拾给。 我是一名探鬼主播祥得,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蒋得!你這毒婦竟也來(lái)了级及?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤额衙,失蹤者是張志新(化名)和其女友劉穎饮焦,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體窍侧,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡县踢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了疏之。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片殿雪。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖锋爪,靈堂內(nèi)的尸體忽然破棺而出丙曙,到底是詐尸還是另有隱情,我是刑警寧澤其骄,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布亏镰,位于F島的核電站,受9級(jí)特大地震影響拯爽,放射性物質(zhì)發(fā)生泄漏索抓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一毯炮、第九天 我趴在偏房一處隱蔽的房頂上張望逼肯。 院中可真熱鬧,春花似錦桃煎、人聲如沸篮幢。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)三椿。三九已至,卻和暖如春葫辐,著一層夾襖步出監(jiān)牢的瞬間搜锰,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工耿战, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蛋叼,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓剂陡,卻偏偏與公主長(zhǎng)得像鸦列,于是被迫代替她去往敵國(guó)和親租冠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鹏倘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容