這篇文章給大家分享的是有關(guān)web開發(fā)中Vuex怎么用的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。
目前創(chuàng)新互聯(lián)已為千余家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬主機(jī)、綿陽(yáng)服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計(jì)、海勃灣網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
什么是vuex
說(shuō)白了就是一個(gè)可以全局管理狀態(tài)的東西,用官方的話說(shuō)是它采用集中式存儲(chǔ)管理應(yīng)用的所有組件的狀態(tài),并以相應(yīng)的規(guī)則保證狀態(tài)以一種可預(yù)測(cè)的方式發(fā)生變化,說(shuō)人話就是可以時(shí)刻監(jiān)聽一個(gè)值的狀態(tài)改變,同時(shí)項(xiàng)目里面別的組件也可以使用這個(gè)變量。做出相應(yīng)的處理。
安裝
這個(gè)是萬(wàn)年不變的,沒(méi)什么好說(shuō)的。直接在項(xiàng)目里面運(yùn)行下面這行代碼
npm install vuex --save
我的業(yè)務(wù)場(chǎng)景
首先說(shuō)一下業(yè)務(wù)場(chǎng)景,不然看代碼是沒(méi)有意義的,畢竟代碼是為了解決業(yè)務(wù)的問(wèn)題,我的業(yè)務(wù)是需要做一個(gè)機(jī)器的管理項(xiàng)目,那么這個(gè)機(jī)器有很多臺(tái),例如機(jī)器1、機(jī)器2等,那么想管理就需要將所有的機(jī)器先拿到,然后根據(jù)需要切換想設(shè)置的機(jī)器,view顯示對(duì)應(yīng)的機(jī)器的配置信息,需求是很明確的,我語(yǔ)言表達(dá)能力不行,直接看圖。
這里簡(jiǎn)單的解釋一下,有人說(shuō),這個(gè)不是很簡(jiǎn)單嘛,直接將切換的函數(shù)寫到select的控件里面,直接點(diǎn)擊切換的函數(shù)的時(shí)候直接給后端對(duì)應(yīng)的uuid,拿到值就可以了,是的,如果只有這一個(gè)頁(yè)面是可以的,但是仔細(xì)看布局,select組件是在一個(gè)公共組件里面的,你選擇的時(shí)候你的uuid是不可以直接給到當(dāng)前頁(yè)面的,即時(shí)給到他,別的配置怎么辦呢?而且我們要做的是切換的時(shí)候直接整個(gè)項(xiàng)目里面的uuid全部改掉,然后重新渲染整個(gè)數(shù)據(jù),才是合理的解決方案。說(shuō)一下我開始的想法,我開始是準(zhǔn)備使用緩存做,每次用戶切換的時(shí)候我都將最新的uuid放到緩存里面,但是有一個(gè)問(wèn)題解決不了就是在別的頁(yè)面怎么實(shí)時(shí)監(jiān)聽這個(gè)值改變了呢?所以,使用vuex是一個(gè)比較合理的解決方案,看代碼
使用
新建一個(gè)store.js
引入
在store.js里面直接將下面的代碼復(fù)制到里面
聲明一個(gè)您需要監(jiān)聽的變量(store.js)
/** * created by ClearLove * @aim 標(biāo)題欄中需要更改自助機(jī)的uuid,所有的返回值都需要是該自助機(jī)下的數(shù)據(jù),所以需要聲明一個(gè)全局的可以監(jiān)聽uuid的變化 * @params machine_uuid_flag 全局uuid */ import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) const state = { machine_uuid_flag: '', //機(jī)器uuid } const getters = { getters_mac_uuid() { return state.machine_uuid_flag } }; const mutations = { mutations_mac_uuid(state, mac_uuid) { state.machine_uuid_flag = mac_uuid } }; const actions = { actions_mac_uuid(state, mac_uuid) { state.commit('mutations_mac_uuid', mac_uuid) } }; export default new Vuex.Store({ state, getters, mutations, actions })
頁(yè)面使用
首先我們子啊公共組件也就是展示select組件的地方將切換事件處理一下
/** * @change_machine 更改自助機(jī) */ change_machine(machine_mac_uuid) { this.machine_id = machine_mac_uuid; // 這里是將最新的更換的機(jī)器的uuid,將store里面的uuid更換掉,這樣才可以保證別的地方使用這個(gè)uuid的地方也會(huì)同時(shí)改變 this.$store.dispatch('actions_mac_uuid',machine_mac_uuid); sessionStorage.setItem('machine_mac_uuid', this.machine_id) },
把引入組件的代碼也貼上來(lái)吧,這樣好理解
<el-select v-model="machine_name" placeholder="自助機(jī)列表" size="mini" @change="change_machine"> <el-option v-for="item in machine_list" :key="item.mac_uuid" :label="item.machine_name" :value="item.mac_uuid"> </el-option> </el-select>
這個(gè)時(shí)候下面的頁(yè)面怎么接收這個(gè)值做出相應(yīng)的改變呢?
created: function () { this.machine_mac_uuid = sessionStorage.getItem('machine_mac_uuid'); this.machine_name = sessionStorage.getItem('machine_name'); //將最新的uuid拿到 this.update_mac_uuid = this.$store.state.machine_uuid_flag; this.get_settings_info() }, /** * 接收store的改變的值 */ computed:{ machine_uuid_flag(){ //將接收到的最新的uuid return出去 return this.$store.state.machine_uuid_flag } }, /** * 監(jiān)聽該store里面值的變化 */ watch: { //監(jiān)聽這個(gè)值是不是接收到,改變的話直接重新執(zhí)行獲取機(jī)器的方法 machine_uuid_flag: function (newvalue , oldvalue) { this.update_mac_uuid = newvalue; //將最新的值傳遞給更新的對(duì)象 this.get_settings_info(); } }, methods: { /** * @get_settings_info 獲取某一臺(tái)自助機(jī)的詳情 */ get_settings_info() { this.$axios({ method: 'post', url: this.api.api_zzj_9006 + 'manager_back/get_main_info/', data: { machine_uuid: this.update_mac_uuid ? this.update_mac_uuid : this.machine_mac_uuid } }).then((res) => { let machine = res.data.data; this.machine_name = machine.machine_name; this.machine_mac_uuid = machine.machine_mac_uuid; this.location = machine.location; this.mac_uuid = machine.mac_uuid; this.machine_uuid = machine.machine_uuid; this.mac_uuid_two = machine.mac_uuid_two; this.expire_data = machine.expire_data; this.environmental_state_dec = machine.environmental_state_dec; this.machine_type_des = machine.machine_type_des; this.system_version = machine.system_version; }).catch((err) => { console.error(err) }) } },
我在想你們是不是心里一萬(wàn)句cnm飄過(guò),寫那么多做什么?裝逼嗎?其實(shí)不是的,是我在看別人的博客的時(shí)候發(fā)現(xiàn)一個(gè)問(wèn)題,就是很多人貼代碼的時(shí)候因?yàn)橘N的是一部分,導(dǎo)致很多人摸不著頭腦,也不知道每一個(gè)方法是怎么傳遞的,我不想我的博客別人看了以后也有這樣的疑問(wèn),所以才整個(gè)直接貼出來(lái),當(dāng)然我會(huì)做出詳細(xì)的解釋,。
解釋一下上面的代碼:首先我們?cè)陧?yè)面加載的時(shí)候也就是created的階段將最新的uuid也就是store里面的全局變量的值拿到,有人說(shuō)你拿到, 為什么還要寫下面的,那么問(wèn)題就來(lái)了,如果用戶在當(dāng)前頁(yè)面直接切換了機(jī)器的uuid,那么他沒(méi)有刷新頁(yè)面,也沒(méi)有切換頁(yè)面,這個(gè)時(shí)候created是不會(huì)執(zhí)行的,是不是,那么最新的uuid怎么更新呢?你即使監(jiān)聽了但是由于createrd不執(zhí)行,導(dǎo)致的問(wèn)題就是你監(jiān)聽的值一直沒(méi)有變化,所以我們需要將頁(yè)面里面的uuid變化時(shí)刻監(jiān)聽,所以我們需要在computed里面接收最新的uuid,然后我們監(jiān)聽這個(gè)里面的值,只要改變,就做出相應(yīng)的改變,這樣就滿足了我們的需求,
問(wèn)題1:為什么使用computed不直接使用watch?
有人看到以后就會(huì)覺(jué)得我們直接監(jiān)聽這個(gè)值不行嗎?我們這里要明白的是watch是只可以監(jiān)聽data里面聲明的變量或者對(duì)象,除此之外是監(jiān)聽不到的,而computed用來(lái)監(jiān)控自己定義的變量,該變量不在data里面聲明,直接在computed里面定義,然后就可以在頁(yè)面上進(jìn)行雙向數(shù)據(jù)綁定展示出結(jié)果或者用作其他處理。
問(wèn)題2:為什么使用緩存?
這里使用緩存的目的是為了你第一次進(jìn)來(lái)的時(shí)候,如果用戶什么都不切換,不執(zhí)行change_machine函數(shù)的話,那么我們請(qǐng)求接口的參數(shù)是空的,所以我們需要默認(rèn)一個(gè)值,你可以直接在store里面默認(rèn),也可以我在第一次進(jìn)來(lái)的時(shí)候直接判斷是不是存在store的值,沒(méi)有的話就用我默認(rèn)的緩存里面的值。
問(wèn)題3: 為什么created里面已經(jīng)拿到了,還要寫監(jiān)聽函數(shù)?
這個(gè)問(wèn)題可能有人會(huì)問(wèn),但是其實(shí)很簡(jiǎn)單,因?yàn)橛脩舨凰⑿马?yè)面的時(shí)候created是不執(zhí)行的,那么我們就拿不到最新的uuid進(jìn)行數(shù)據(jù)的更新,所以要寫監(jiān)聽的函數(shù)。
問(wèn)題4: 為什么使用this.$store.dispatch?
我們這里使用是根據(jù)官方文檔來(lái)的,你可以直接使用commit或者什么也不用,直接this.$store.state.machine_uuid_flag也是可以的,但是我們改變了uuid,那么就要重置一下store里面的原始值,所以這里需要接收我們改變的值,也就是用戶選擇了別的機(jī)器的時(shí)候用的值。如果我們不需要重置原始值的話,可以直接定義一個(gè)全局變量,然后直接
this.$store.state.machine_uuid_flag(這里格式亂了)就可以了,但是這樣的業(yè)務(wù)場(chǎng)景應(yīng)該不多。畢竟我們定義了就是為了改變它從而我們可以監(jiān)聽這個(gè)變化的值。
感謝各位的閱讀!關(guān)于“web開發(fā)中Vuex怎么用”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
網(wǎng)頁(yè)題目:web開發(fā)中Vuex怎么用
瀏覽地址:http://aaarwkj.com/article28/iggpcp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、面包屑導(dǎo)航、微信公眾號(hào)、移動(dòng)網(wǎng)站建設(shè)、域名注冊(cè)、定制開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)