Frontend: ein gründliches Verständnis von vuex (mapState, mapGetters, mapMutations, mapActions)

1. Zustand

1.1 Zustandsverwendung

Nach der Einführung von vuex müssen wir Variablen im Zustand definieren, ähnlich wie die Daten in vue, um den Zustand durch den Zustand zu speichern

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
    
    
  state: {
    
     //存放状态
    nickname:'Simba',
    age:20,
    gender:'男'
  },
  mutations: {
    
    },
  actions: {
    
    },
  modules: {
    
    }
})

Registrieren Sie zwei Komponenten und führen Sie sie jeweils in app.vue ein

<div id="app">
    <vabout> </vabout>
    <vhome> </vhome>
  </div>

Inhalt der vhome-Komponente

<div class="home">{
    
    {
    
    $store.state.nickname}}</div>

vüber Komponenteninhalt

<h1>{
    
    {
    
    $store.state.nickname}}:{
    
    {
    
    $store.state.age}}</h1>

Bildbeschreibung hier einfügen
Wie in der Abbildung zu sehen, wird der entsprechende Inhalt angezeigt.Bei vuex müssen wir uns nicht um die Wertübertragung zwischen Komponenten kümmern, wir können verschiedene Daten direkt über $store beziehen, aber wenn wir zu diesem Zeitpunkt mehrere Daten in vuex benötigen, Dies ist zu ausführlich, um es zu schreiben, wir können es in berechnet definieren.

Die Initialisierung von Requisiten, Methoden, Daten und Berechnungen erfolgt zwischen beforeCreated und created.
Beispiel:

<template>
  <div class="home">
    {
    
    {
    
    nickname}}
  </div>
</template>
<script>
export default {
    
    
  name: 'home',
  computed:{
    
    
    nickname(){
    
    
      return this.$store.state.nickname
    }
  }
}

Dies erleichtert den Import erheblich.

1.2 MapState-Hilfsfunktion

Obwohl die Methode in 1.1 einfach einzuführen ist, gibt es immer noch eine Menge Code, der in computed definiert ist, und zu diesem Zeitpunkt stellt uns vuex eine einfachere Methode mapState method zur Verfügung

import {
    
    mapState} from 'vuex'
export default {
    
    
  name: 'home',
  computed: mapState(['nickname','age','gender'])
}

in

mapState(['nickname','age','gender']) //映射哪些字段就填入哪些字段

Dieser Code entspricht dem folgenden

nickname(){
    
    return this.$store.state.nickname}
age(){
    
    return this.$store.state.age}
gender(){
    
    return this.$store.state.gender}

Denken Sie daran: Bei der Verwendung von Hilfsfunktionen wie mapState sind der vorherige Methodenname und der erworbene Eigenschaftsname identisch.

Was ist, wenn wir eine berechnete Eigenschaft anpassen müssen? Wie füge ich es hinzu?
Immerhin wird jetzt berechnet: mapState(['nickname','age','gender'])
Zu diesem Zeitpunkt brauchen wir den Spread-Operator in es6:…

computed: {
    
       //computed是不能传参数的
  value(){
    
    
   return this.val/7
},
  ...mapState(['nickname','age','gender'])
}

Zwei, Getter

2.1 Die Verwendung von Gettern

Getter entsprechen den berechneten Eigenschaften in Vue. Die weitere Verarbeitung erfolgt über Getter, um den gewünschten Wert zu erhalten, und Parameter sind zulässig. Der erste Parameter ist state.

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
 
export default new Vuex.Store({
    
    
  state: {
    
     //存放状态
    nickname:'Simba',
    firstname:'张',
    lastname:'三丰',
    age:20,
    gender:'男',
    money:1000
  },
  getters:{
    
    
    realname(state){
    
    
      return state.firstname+state.lastname
    },
    money_us(state){
    
    
      return (state.money/7).toFixed(2)
    }
  },
  mutations: {
    
    },
  actions: {
    
    },
  modules: {
    
    }
})

Teil sehen

computed: {
    
      //computed是不能传参数的
 valued(){
    
    
   return this.value/7
 },
 ...mapGetters(['realname','money_us'])
}

3. Mutation

3.1 Verwendung von Mutationen

Wir brauchen einige Mutationen, wenn wir in unserem Code definieren, was den Methoden in vue ähnelt,

Mutationen müssen die darin enthaltene Methode per Commit aufrufen. Sie kann auch Parameter übergeben. Der erste Parameter ist state und der zweite Parameter ist payLoad, was ein zusätzlicher Parameter ist.

Code zeigen wie unten

mutations: { //类似于methods
  addAge(state,payLoad){
     state.age+=payLoad.number
  }
}

Vorlagenabschnitt

<div class="home">
   <div><button @click="test">测试</button></div>
</div>

js-Teil

methods:{
    
    
 test(){
    
    
   this.$store.commit('addAge',{
    
    
     number:5
   })
 }
}

Beim Aufruf schreiben Sie den zweiten Parameter am besten in Form eines Objekts, damit wir mehr Informationen übergeben können.

Allerdings wird das Schreiben auf diese Weise immer noch auf das gleiche Problem stoßen, das heißt, wenn Sie mehrere Daten manipulieren müssen, wird es problematisch.Zu diesem Zeitpunkt benötigen wir mapMutations, um die Methode durch sie abzubilden.

3.2 Kartenmutationen

Dasselbe wie mapState, mapGetters

methods:{
    
    
 ...mapMutations(['addAge'])
}

Der Satz mapMutations(['addAge']) entspricht dem folgenden Code

addAge(payLoad){
    
    
  this.$store.commit('addAge',payLoad)
}

Parameter, die wir schreiben können, wenn wir diese Methode aufrufen

<button @click="addAge({number:5})">测试</button>

Zu diesem Zeitpunkt werden einige Gangster sagen, warum sollte ich herumgehen und den Zustand der Mutationen ändern? Kann ich den Status direkt ändern?

Zum Beispiel:

addAge(){
    
    
 this.$store.state.age +=5;
}

Sie können die Ergebnisse tatsächlich sehen, also warum sollte ich von Mutationen übertragen?

Die Gründe dafür sind folgende:
① Es ist nicht nur möglich, Zuweisungsoperationen
in Mutationen durchzuführen ② Der Autor hat eine ähnliche Operation mit vergrabenen Punkten in Mutationen durchgeführt.Wenn Sie von Mutationen aus operieren, kann sie erkannt werden, was mit Debugging einfacher zu debuggen ist Tools und Debugging-Tools können Änderungen in Echtzeit erkennen, und das direkte Ändern der Attribute im Status kann nicht in Echtzeit überwacht werden

Hinweis: Mutationen können nur synchrone Methoden schreiben, keine asynchronen wie axios, setTimeout usw. Diese können nicht geschrieben werden Die Hauptfunktion von Mutationen besteht darin, den Zustand zu ändern.

Der Grund ist ähnlich: Wenn Sie asynchron in Mutationen schreiben, kann es erfolgreich angepasst werden, aber weil es asynchron ist, kann es nicht von Debugging-Tools verfolgt werden. Es wird nicht empfohlen, auf diese Weise zu schreiben, was dem Debugging nicht förderlich ist ist die offizielle Vereinbarung.

3.3 Verwenden Sie Konstanten anstelle von Mutationsereignistypen

Konvertieren Sie den ursprünglichen Methodennamen von einer Zeichenfolge in eine Konstante

Code zeigen wie folgt:

import Vue from 'vue'
import Vuex from 'vuex'
export const ADD_AGE ='addAge' 
Vue.use(Vuex)
export default new Vuex.Store({
    
    
  state: {
    
     //存放状态
    nickname:'Simba',
    firstname:'张',
    lastname:'三丰',
    age:20,
    gender:'男',
    money:1000
  },
  getters:{
    
     //类似于 computed
    realname:state =>state.firstname+state.lastname,
    money_us(state){
    
    
      return (state.money/7).toFixed(2)
    }
  },
  mutations: {
    
     //类似于methods
     [ADD_AGE](state,payLoad){
    
    
         state.age+=payLoad.number
     }
  },
  actions: {
    
     },
  modules: {
    
    }
})

Definieren Sie den Namen der Methode addAge als Konstante und importieren Sie diese direkt beim Aufruf

import {
    
    ADD_AGE} from '../store'
import {
    
    mapMutations} from 'vuex'
export default {
    
    
  methods:{
    
    
    ...mapMutations([ADD_AGE])
  }
}

Der Vorteil, so zu schreiben:

① Es ist nicht einfach, Fehler zu schreiben, die Zeichenfolge kann leicht falsch geschrieben werden, und die falsche Position wird nicht gemeldet, nachdem die Zeichenfolge falsch geschrieben wurde, aber sie wird durch eine Konstante ersetzt. Wenn sie falsch ist, kann eslint das Falsche hervorrufen Position

Beim Ersetzen von Mutationen durch Konstanten können wir eine neue Datei (mutation_type.js) erstellen, um diese Konstanten zu speichern

mutation_type.js-Abschnitt

export default {
    
    
   ADD_AGE: ‘addAge’
}

Importieren Sie es dann in store/index.js

import MUTATION_TYPES from ‘./mutation_type’(先引入)
export let MUTATION_TYPE=MUTATION_TYPES (再导出)

An dieser Stelle gibt es eine Grube, kombinieren Sie Import und Export nicht in einer Codezeile: so

export {
    
     foo, bar } from 'my_module';
// 可以简单理解为
import {
    
     foo, bar } from 'my_module';
export {
    
     foo, bar };

Anzumerken ist, dass beides nicht dasselbe ist: foo und bar werden, nachdem sie in einer Zeile geschrieben wurden, nicht wirklich in das aktuelle Modul importiert, sondern sind gleichbedeutend mit der Weiterleitung dieser beiden Schnittstellen nach außen, so dass das aktuelle Modul dies nicht kann Verwenden Sie direkt foo und bar.

Teil sehen

import {
    
    MUTATION_TYPE} from '../store'
methods:{
    
    
  ...mapMutations([MUTATION_TYPE.ADD_AGE])
}

Zusammenfassend:
① Verlassen Sie sich auf den Zustand, um neue Daten zu erhalten, verwenden Sie Getter (wie berechnet, nur lesbar)
② Um den Attributwert des Zustands zu ändern, verwenden Sie Mutationen (synchrone Operation)

Vier, Aktionen

4.1 Aktion ist Mutation ähnlich

Unterschied: Aktion kann Mutationsaktion einreichen
und Zustand nicht direkt ausführen, sondern Mutation ausführen

Aktion enthält asynchrone Operationen, ähnlich wie Axios-Anforderungen, die in Aktion geschrieben werden können

Die in Aktion befindlichen Methoden sind standardmäßig asynchron und geben Zusagen zurück

Code zeigen wie unten

Shop-Bereich

actions: {
    
    
  getUserInfo(){
    
    
    return {
    
    
      nickname:'Simba',
      age:20
    }
  }
}

Definieren Sie eine Methode in Aktionen: getUserInfo, und geben Sie ein Objekt zurück

Teil sehen

created(){
    
    
  var res = this.getUserInfo()
  console.log(res)
 
},
methods:{
    
    
  ...mapActions(['getUserInfo'])
}

Rufen Sie diese Methode in created auf, weisen Sie das Ergebnis res zu, drucken Sie res und geben Sie Promise als Ergebnis aus

Dies zeigt, dass die Methoden in Aktionen standardmäßig asynchron sind und dann Daten übertragen

mapActions(['getUserInfo']) entspricht dem folgenden Code

getUserInfo(){
    
    
  return this.$store.dispatch(‘getUserInfo’)
}

In der aktuellen Entwicklung ist der Attributwert im Zustand leer, nach dem Einloggen werden die entsprechenden Informationen abgerufen.

Nach der Anmeldung müssen Sie Benutzerinformationen abrufen, wie erhalten Sie diese?

Rufen Sie zuerst die getUserInfo-Methode in Aktionen auf, wenn Sie die Seite betreten

Code zeigen wie unten

Teil sehen

created(){
    
     this.getUserInfo()}
methods:{
    
     ...mapActions([‘getUserInfo’])}

Shop-Bereich

Wenn Sie die Daten erhalten möchten, ist dies zunächst gleichbedeutend mit der Zuweisung eines Werts an den Zustand.Das erste, was Ihnen in den Sinn kommt, ist, den Zustand mit Mutationen zu manipulieren, aber die angeforderten Schnittstellen sind alle asynchron mit Axios, also Sie können keine Mutationen, sondern Aktionen verwenden, und Aktionen verwenden, um Mutationen zu manipulieren, um den Zustand zu manipulieren.

export default new Vuex.Store({
    
    
 state: {
    
     
  nickname:‘’,
  age:0,
  gender:'',
  money:0
 },
 mutations: {
    
    
  setUerInfo(state,payLoad){
    
    
   state.nickname = payLoad.nickname
   state.age = payLoad.age
   state.gender = payLoad.gender
   state.money = payLoad.money
  }
},
actions: {
    
     //actions没有提供state当参数
 async getToken({
     
     commit}){
    
    
   var res = await axios.get('/token接口')
   commit('setToken',res)
 },
async getUserInfo(context){
    
     
//context可以理解为它是整个Store的对象.类似于this.$store,他里面包含了state,getter,mutations,actions
  const res = await axios.get('/接口url')
  context.commit('setUerInfo',res) 
//相当于 this.$store.commit,第一个参数是方法名,第二个参数是要传入的数据
  context.dispatch('getToken') 
//actions也可以调用自己的其他方法
    },
  }
})

Geben Sie im laufenden Prozess nach dem Aufrufen der getUserInfo-Methode Aktionen ein und rufen Sie dann setUserInfo über commit auf, übergeben Sie res (Benutzerinformationen) als Parameter und weisen Sie state den entsprechenden Attributwert zu, um die Operation dieses Prozesses abzuschließen.

Die Parameter von getUserInfo können auch destrukturiert werden, was bequemer ist

async getUserInfo({
     
     commit,dispatch}){
    
     
  const res = await axios.get('/接口url')
  commit('setUerInfo',res) 
  dispatch('getToken')
}

Ich denke du magst

Origin blog.csdn.net/zhanggqianglovec/article/details/124423640
Empfohlen
Rangfolge