Vuex - przekazanie wielu parametrów do mutacji

126

Próbuję uwierzytelnić użytkownika za pomocą paszportu vuejs i laravel.

Nie jestem w stanie dowiedzieć się, jak wysłać wiele parametrów do mutacji vuex za pomocą akcji.

- sklep -

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)
    }
})

- metoda logowania -

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()
              })
     })
}



Byłbym bardzo wdzięczny za jakąkolwiek pomoc!

Schwesi
źródło

Odpowiedzi:

172

Mutacje oczekują dwóch argumentów: statei payload, gdzie aktualny stan sklepu jest przekazywany przez sam Vuex jako pierwszy argument, a drugi argument zawiera wszelkie parametry, które musisz przekazać.

Najłatwiejszym sposobem przekazania szeregu parametrów jest ich zniszczenie :

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

Później w swoich działaniach możesz po prostu

store.commit('authenticate', {
    token,
    expiration,
});
Gnida
źródło
Nie oczekuje drugiego argumentu, jest opcjonalny.
kopie
Do czego służą parametryaction
Idris Stack
109

Mówiąc prościej, musisz zbudować swój ładunek w tablicy kluczy

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

Następnie wyślij ładunek bezpośrednio do akcji

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

Żadnych zmian w Twoim działaniu

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

W swojej mutacji wywołaj wartości kluczem

'YOUR_MUTATION' (state,  payload ){
  state.state1 = payload.key1
  state.state2 =  payload.key2
},
peterretief
źródło
2
Dziękuję Ci. Właśnie tego szukałem
BoundForGlory
Uprościłem proces, ponieważ
wydało
1
dla prostego użycia możesz zrobić po ES6 'YOUR_MUTATION' (state, {key1, key2}) {state.state1 = key1 state.state2 = key2},
pabloRN
3

myślę, że to może być tak proste, załóżmy, że zamierzasz przekazać wiele parametrów do swojej akcji, gdy tam czytasz, akcje akceptują tylko dwa parametry contexti payloadktóre są danymi, które chcesz przekazać w działaniu, więc weźmy przykład

Konfigurowanie akcji

zamiast

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

robić

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

Wywołanie (wysyłanie) Akcja

zamiast

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

robić

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

mam nadzieję, że to pomoże

liberi
źródło