vuex輔助函數和vuex5個屬性


  在上篇中,我們可以知道如果想要訪問vuex.store中state中的數據,需要this.$store.state.屬性名。顯然這樣訪問數據寫的代碼很很不簡潔的,輔助函數就是用來解決這個問題的。

1、輔助函數:

  通過輔助函數mapState、mapActions、mapMutations,把vuex.store中的屬性映射到vue實例身上,這樣在vue實例中就能訪問vuex.store中的屬性了,對於操作vuex.store就很方便了。

  state輔助函數為mapState,actions輔助函數為mapActions,mutations輔助函數為mapMutations。(Vuex實例身上有mapState、mapActions、mapMutations屬性,屬性值都是函數)

2、如何使用輔助函數

   在當前組件中引入Vuex

   通過Vuex來調用輔助函數

3、輔助函數如何去映射vuex.store中的屬性

  1、mapState:把state屬性映射到computed身上

computed:{
         ...Vuex.mapState({
            input:state=>state.inputVal,
            n:state=>state.n
        })   
    }

 

屬性1:state:    
      用來存儲公共的狀態  在state中的數據都是響應式的。 
        響應式原因:state里面有一個getters、setters方法;data中的數據也是響應式的,因為里面也有getters和setters方法

      輔助函數
        mapState

        1、在computed屬性中來接收state中的數據  接收方式有2種(數組和對象,推薦對象)

          computed:Vuex.mapState(["屬性"])  把state中的數據通過mapState映射到computed組件身上

          computed:Vuex.mapState({
            key:state=>state.屬性   //優點:01本身key值是別名,要的是val的值,key的值a 和 val="a"一樣就行,隨意寫。
                                      減少state里面長的屬性名。 02可以在函數內部查看state中的數據
                                      數組方式的話,必須按照state中的屬性名
          })


        2、如果自身組件也需要使用computed的話,通過解構賦值去解構出來

          computed:{
            ...Vuex.mapState({
               key:state=>state.屬性
            })
          }

 

    2、mapAcions:把actions里面的方法映射到methods中
  
methods:{
        ...Vuex.mapActions({
            add:"handleTodoAdd",    //val為actions里面的方法名稱
            change:"handleInput"     
        })
    }
//直接代用add和change方法就行,
不過要記得在actions里面做完數據業務邏輯的操作

之前我們還需要這樣寫一大串函數調用,
// methods: {
// handleInput(e){           
// let val = e.target.value;

// this.$store.dispatch("handleInput",val )
// },
// handleAdd(){
// this.$store.dispatch("handleTodoAdd")
// }
// }
 

 

屬性2actions:     
        actions里面的函數主要用來處理異步的函數以及一些業務邏輯,每一個函數里面都有一個形參 這個形參是一個對象
        里面有一個commit方法,這個方法用來觸發mutations里面的方法
        
        輔助函數
        mapActions

        使用方式
          methods:Vuex.mapActions([""])


          methods:{
            ...Vuex.mapActions({
              key:val--->actions里面的方法名稱
            })

          }

  3、mapMutations:把mutations里面的方法映射到methods中

    只是做簡單的數據修改(例如n++),它沒有涉及到數據的處理,沒有用到業務邏輯或者異步函數,可以直接調用mutations里的方法修改數據。

 

methods:{
      
        ...Vuex.mapMutations({
            handleAdd:"handlMutationseAdd"
        })
    }

 

 

屬性3:mutations:    
      mutations里面的函數主要用來修改state中的數據。mutations里面的所以方法都會有2個參數  一個是store中的state
      另外一個是需要傳遞的參數

      輔助函數
      mapMutations
             使用方式
          methods:Vuex.mapMutations([""])


          methods:{
            ...Vuex.mapMutations({
              key:val--->actions里面的方法名稱
            })

          }
      

 

 理解state、actions、mutations,可以參考MVC框架。state可以比喻成一個數據庫,知識它是響應式的,刷新頁面數據就會改變;actions比喻成controller層,做數據的業務邏輯;mutations比喻成model層,做數據的增刪改查操作。

   4、mapGetters:把getters屬性映射到computed身上

 

 computed:{
        ...Vuex.mapGetters({
            NumN:"NumN"
        })
       
    }

 

 

屬性4:getters:計算屬性
          getters類似於組件里面computed同時也是監聽屬性的變化,當state中的屬性發生改變的時候就會
          觸發getters里面的方法。getters里面的每一個方法中都會有一個參數 state


          使用方式
            this.$store.getters.方法名稱


          輔助函數

            mapGetters


            mapgetters使用在組件的computed中


            1、
              Vuex.mapGetters(["方法名稱"])
              Vuex.mapGetters({
                key:val--》val就是getters中的函數名稱
              })

 

  5、modules屬性:  模塊 (和輔助函數沒關系了)
    把公共的狀態按照模塊進行划分
    1、每個模塊都相當於一個小型的Vuex
    2、每個模塊里面都會有state getters actions mutations
    3、切記在導出模塊的時候 加一個 namespaced:true 主要的作用是將每個模塊都有獨立命名空間
4、namespace:true
  在多人協作開發的時候,由於個人單詞量有限,可能子模塊和主模塊中的函數名字會相同,這樣嗲用函數的時候,相同名字的函數都會被調用,就會發生問題。
  為了解決這個問題,上面提到了導出模塊的時候要加namespace:true.
  那么怎么調用子模塊中的函數呢?假如我的子模塊名字為todo.js。  函數名字就改成todo/函數名字。
 
  為什么這樣寫調用,輸出模塊后的store實例
  也可以看到模塊化后,store實例的state屬性的訪問改變了, this.$store.state.todo.inputVal
 
可以簡單總結一下輔助函數通過vuex使用,比喻成映射關系為: mapState/mapGettes--->computed  ;  mapAcions/mapMutations---->methods   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM