欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Vuex的實(shí)戰(zhàn)使用詳解

 更新時(shí)間:2019年10月31日 08:38:14   作者:何處錦繡不灰堆  
這篇文章主要介紹了Vuex的實(shí)戰(zhàn)使用詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

寫在前面

我是一個(gè)看技術(shù)的文檔不喜歡官方的人,覺得官方寫的任何東西都是比較正式的,讓人有點(diǎn)不想看的趕腳,我這里也不貼官方的那個(gè)圖了,這里也不解釋了(其實(shí)是我也不想研究)所以我一般都是百度一些別人的經(jīng)驗(yàn)之談,看別人的經(jīng)驗(yàn)之談可以讓你少踩一些坑,而且是可以直接看到效果的,所以這里也是,我們不按照官方的來(lái),那么有利有弊,利就是好理解,弊就是可能寫的不夠?qū)I(yè),會(huì)讓一些人誤會(huì),總之我權(quán)衡之后還是選擇看著官方的一些東西然后結(jié)合自己的使用來(lái)說一下怎么玩這個(gè)vuex的。說實(shí)話我開始使用的時(shí)候覺得這個(gè)東西還是很好的,畢竟結(jié)合自己的需求,如果您的項(xiàng)目一直沒有用到這個(gè)的地方可能體會(huì)不到,這里就開始寫玩法。

什么是vuex

說白了就是一個(gè)可以全局管理狀態(tài)的東西,用官方的話說是它采用集中式存儲(chǔ)管理應(yīng)用的所有組件的狀態(tài),并以相應(yīng)的規(guī)則保證狀態(tài)以一種可預(yù)測(cè)的方式發(fā)生變化,說人話就是可以時(shí)刻監(jiān)聽一個(gè)值的狀態(tài)改變,同時(shí)項(xiàng)目里面別的組件也可以使用這個(gè)變量。做出相應(yīng)的處理。

安裝

這個(gè)是萬(wàn)年不變的,沒什么好說的。直接在項(xiàng)目里面運(yùn)行下面這行代碼

npm install vuex --save

我的業(yè)務(wù)場(chǎng)景

首先說一下業(yè)務(wù)場(chǎng)景,不然看代碼是沒有意義的,畢竟代碼是為了解決業(yè)務(wù)的問題,我的業(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)單的解釋一下,有人說,這個(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ù),才是合理的解決方案。說一下我開始的想法,我開始是準(zhǔn)備使用緩存做,每次用戶切換的時(shí)候我都將最新的uuid放到緩存里面,但是有一個(gè)問題解決不了就是在別的頁(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飄過,寫那么多做什么?裝逼嗎?其實(shí)不是的,是我在看別人的博客的時(shí)候發(fā)現(xiàn)一個(gè)問題,就是很多人貼代碼的時(shí)候因?yàn)橘N的是一部分,導(dǎo)致很多人摸不著頭腦,也不知道每一個(gè)方法是怎么傳遞的,我不想我的博客別人看了以后也有這樣的疑問,所以才整個(gè)直接貼出來(lái),當(dāng)然我會(huì)做出詳細(xì)的解釋,。

解釋一下上面的代碼:首先我們?cè)陧?yè)面加載的時(shí)候也就是created的階段將最新的uuid也就是store里面的全局變量的值拿到,有人說你拿到, 為什么還要寫下面的,那么問題就來(lái)了,如果用戶在當(dāng)前頁(yè)面直接切換了機(jī)器的uuid,那么他沒有刷新頁(yè)面,也沒有切換頁(yè)面,這個(gè)時(shí)候created是不會(huì)執(zhí)行的,是不是,那么最新的uuid怎么更新呢?你即使監(jiān)聽了但是由于createrd不執(zhí)行,導(dǎo)致的問題就是你監(jiān)聽的值一直沒有變化,所以我們需要將頁(yè)面里面的uuid變化時(shí)刻監(jiān)聽,所以我們需要在computed里面接收最新的uuid,然后我們監(jiān)聽這個(gè)里面的值,只要改變,就做出相應(yīng)的改變,這樣就滿足了我們的需求,

問題1:為什么使用computed不直接使用watch?

有人看到以后就會(huì)覺得我們直接監(jiān)聽這個(gè)值不行嗎?我們這里要明白的是watch是只可以監(jiān)聽data里面聲明的變量或者對(duì)象,除此之外是監(jiān)聽不到的,而computed用來(lái)監(jiān)控自己定義的變量,該變量不在data里面聲明,直接在computed里面定義,然后就可以在頁(yè)面上進(jìn)行雙向數(shù)據(jù)綁定展示出結(jié)果或者用作其他處理。

問題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的值,沒有的話就用我默認(rèn)的緩存里面的值。

問題3: 為什么created里面已經(jīng)拿到了,還要寫監(jiān)聽函數(shù)?

這個(gè)問題可能有人會(huì)問,但是其實(shí)很簡(jiǎn)單,因?yàn)橛脩舨凰⑿马?yè)面的時(shí)候created是不執(zhí)行的,那么我們就拿不到最新的uuid進(jìn)行數(shù)據(jù)的更新,所以要寫監(jiān)聽的函數(shù)。

問題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è)變化的值。

總結(jié)

寫到這里基本上的用法我寫完了,可能寫的沒有那些大神寫的詳細(xì),也沒有什么原理分析,寫的也比較淺顯,我看很多人寫博客的時(shí)候喜歡分析一下原理,一方面顯的專業(yè)性比較高,一方面可以有利于自己的理解和別人的理解,首先我也是不經(jīng)常使用這個(gè)技術(shù)棧,其次是我個(gè)人覺得用的好要比明白原理強(qiáng),我不喜歡只講原理一個(gè)例子都不寫的人,畢竟例子是最可以發(fā)現(xiàn)問題的,也是最直觀的,就寫到這里吧,以后再更新,我寫博客的目的是記錄自己寫項(xiàng)目的過程,記錄用到的東西,以后用到了更深的再更新,希望可以幫助到人更好。寫的不對(duì)的希望可以直接聯(lián)系我,我及時(shí)糾正,謝謝大家的支持。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue項(xiàng)目報(bào)錯(cuò)Uncaught runtime errors的解決方案

    vue項(xiàng)目報(bào)錯(cuò)Uncaught runtime errors的解決方案

    使用vue-cli的vue項(xiàng)目,出現(xiàn)編譯錯(cuò)誤或警告時(shí),在瀏覽器中顯示全屏覆蓋,提示報(bào)錯(cuò)Uncaught runtime errors,本文給大家介紹了vue項(xiàng)目報(bào)錯(cuò)Uncaught runtime errors的解決方案,需要的朋友可以參考下
    2024-01-01
  • vue 怎么創(chuàng)建組件及組件使用方法

    vue 怎么創(chuàng)建組件及組件使用方法

    vue中的核心就是組件,組件 (Component) 是 Vue.js 最強(qiáng)大的功能之一。組件可以擴(kuò)展 HTML 元素,封裝可重用的代碼,下面通過本文重點(diǎn)給大家介紹vue 創(chuàng)建組件及組件使用方法,感興趣的朋友一起看看吧
    2017-07-07
  • vue-router 控制路由權(quán)限的實(shí)現(xiàn)

    vue-router 控制路由權(quán)限的實(shí)現(xiàn)

    這篇文章主要介紹了vue-router 控制路由權(quán)限的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • element-ui?tree?異步樹實(shí)現(xiàn)勾選自動(dòng)展開、指定展開、指定勾選功能

    element-ui?tree?異步樹實(shí)現(xiàn)勾選自動(dòng)展開、指定展開、指定勾選功能

    這篇文章主要介紹了element-ui?tree?異步樹實(shí)現(xiàn)勾選自動(dòng)展開、指定展開、指定勾選,項(xiàng)目中用到了vue的element-ui框架,用到了el-tree組件,由于數(shù)據(jù)量很大,使用了數(shù)據(jù)懶加載模式,即異步樹,需要的朋友可以參考下
    2022-08-08
  • vuex的輔助函數(shù)該如何使用

    vuex的輔助函數(shù)該如何使用

    vue通過輔助函數(shù)mapState、mapActions、mapMutations,把vuex.store中的屬性映射到vue實(shí)例身上,這樣在vue實(shí)例中就能訪問vuex.store中的屬性了,對(duì)于操作vuex.store就很方便了,本文具體的介紹下這些輔助函數(shù)的使用方法
    2021-06-06
  • Pinia介紹及工作原理解析

    Pinia介紹及工作原理解析

    這篇文章主要為大家介紹了Pinia介紹及工作原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • vue使用codemirror的兩種用法

    vue使用codemirror的兩種用法

    這篇文章主要介紹了在vue里使用codemirror的兩種用法,每種方法通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • 基于vue實(shí)現(xiàn)頁(yè)面滾動(dòng)加載的示例詳解

    基于vue實(shí)現(xiàn)頁(yè)面滾動(dòng)加載的示例詳解

    頁(yè)面內(nèi)容太多會(huì)導(dǎo)致加載速度過慢,這時(shí)可考慮使用滾動(dòng)加載即還沒有出現(xiàn)在可視范圍內(nèi)的內(nèi)容塊先不加載,出現(xiàn)后再加載,所以本文給大家介紹了基于vue實(shí)現(xiàn)頁(yè)面滾動(dòng)加載的示例,需要的朋友可以參考下
    2024-01-01
  • Vue編譯器AST抽象語(yǔ)法樹源碼分析

    Vue編譯器AST抽象語(yǔ)法樹源碼分析

    這篇文章主要為大家介紹了Vue編譯器AST抽象語(yǔ)法樹源碼分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • vue子組件實(shí)時(shí)獲取父組件的數(shù)據(jù)實(shí)現(xiàn)

    vue子組件實(shí)時(shí)獲取父組件的數(shù)據(jù)實(shí)現(xiàn)

    本文主要介紹了vue子組件實(shí)時(shí)獲取父組件的數(shù)據(jù)實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-12-12

最新評(píng)論