Vuex - birden fazla parametrenin mutasyona geçirilmesi


126

Vuejs ve laravel pasaportunu kullanarak bir kullanıcının kimliğini doğrulamaya çalışıyorum.

Bir eylem aracılığıyla vuex mutasyonuna birden fazla parametrenin nasıl gönderileceğini çözemiyorum.

- mağaza -

export default new Vuex.Store({
    state: {
        isAuth: !!localStorage.getItem('token')
    },
    getters: {
        isLoggedIn(state) {
            return state.isAuth
        }
    },
    mutations: {
        authenticate(token, expiration) {
            localStorage.setItem('token', token)
            localStorage.setItem('expiration', expiration)
        }
    },
    actions: {
        authenticate: ({ commit }, token, expiration) => commit('authenticate', token, expiration)
    }
})

- giriş yöntemi -

login() {
      var data = {
           client_id: 2,
           client_secret: '**************************',
           grant_type: 'password',
           username: this.email,
           password: this.password
      }
      // send data
      this.$http.post('oauth/token', data)
          .then(response => {
              // send the parameters to the action
              this.$store.dispatch({
                  type: 'authenticate',
                  token: response.body.access_token,
                  expiration: response.body.expires_in + Date.now()
              })
     })
}



Her türlü yardım için çok minnettar olurum!

Yanıtlar:


172

Mutasyonlar iki argüman bekler: stateve payload, deponun mevcut durumu Vuex tarafından ilk argüman olarak iletilir ve ikinci argüman iletmeniz gereken tüm parametreleri içerir.

Bir dizi parametreyi geçirmenin en kolay yolu onları yok etmektir :

mutations: {
    authenticate(state, { token, expiration }) {
        localStorage.setItem('token', token);
        localStorage.setItem('expiration', expiration);
    }
}

Daha sonra eylemlerinizde şunları yapabilirsiniz:

store.commit('authenticate', {
    token,
    expiration,
});

O değil beklemek isteğe bağlıdır, ikinci argüman.
digout

Parametreler ne içinaction
Idris Stack

110

Basit bir ifadeyle, yükünüzü anahtar bir dizide oluşturmanız gerekir

payload = {'key1': 'value1', 'key2': 'value2'}

Ardından yükü doğrudan eyleme gönderin

this.$store.dispatch('yourAction', payload)

Eyleminizde değişiklik yok

yourAction: ({commit}, payload) => {
  commit('YOUR_MUTATION',  payload )
},

Mutasyonunuzda değerleri anahtarla arayın

'YOUR_MUTATION' (state,  payload ){
  state.state1 = payload.key1
  state.state2 =  payload.key2
},

2
Teşekkür ederim. Tam olarak aradığım
buydu

Süreci basitleştirdim çünkü kafa karıştırıcı buldum, yardımcı olabildiğim için memnunum
peterretief

1
basit kullanım için ES6 'YOUR_MUTATION' (durum, {key1, key2}) {state.state1 = key1 state.state2 = key2},
pabloRN

3

Sanırım bu basit olabilir, burada okurken eylemler yalnızca iki parametre kabul eder contextve payloadeylemde geçirmek istediğiniz verilerinizdir, bu yüzden bir örnek verelim.

Eylem Ayarlama

onun yerine

actions: {
        authenticate: ({ commit }, token, expiration) => commit('authenticate', token, expiration)
    }

yapmak

actions: {
        authenticate: ({ commit }, {token, expiration}) => commit('authenticate', token, expiration)
    }

Çağrı (gönderme) Eylemi

onun yerine

this.$store.dispatch({
                  type: 'authenticate',
                  token: response.body.access_token,
                  expiration: response.body.expires_in + Date.now()
              })

yapmak

this.$store.dispatch('authenticate',{
                  token: response.body.access_token,
                  expiration: response.body.expires_in + Date.now()
              })

umarım bu yardımcı olur

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.