Vuex - passando vários parâmetros para mutação

124

Estou tentando autenticar um usuário usando o passaporte do vuejs e do laravel.

Não consigo descobrir como enviar vários parâmetros para a mutação vuex por meio de uma ação.

- loja -

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

- método de login -

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



Ficaria muito grato por qualquer tipo de ajuda!

Schwesi
fonte

Respostas:

172

As mutações esperam dois argumentos: stateepayload , onde o estado atual da loja é passado pelo próprio Vuex como o primeiro argumento e o segundo argumento contém todos os parâmetros que você precisa passar.

A maneira mais fácil de passar uma série de parâmetros é destruí-los :

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

Então, mais tarde em suas ações, você pode simplesmente

store.commit('authenticate', {
    token,
    expiration,
});
Nit
fonte
Não espera o segundo argumento, é opcional.
digout
Para que servem os parâmetrosaction
Idris Stack
108

Em termos simples, você precisa construir sua carga útil em uma matriz de chave

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

Em seguida, envie a carga útil diretamente para a ação

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

Nenhuma mudança em sua ação

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

Em sua mutação, chame os valores com a chave

'YOUR_MUTATION' (state,  payload ){
  state.state1 = payload.key1
  state.state2 =  payload.key2
},
peterretief
fonte
2
Obrigado. Isso é exatamente o que eu estava procurando
BoundForGlory
Simplifiquei o processo porque o achei confuso, fico feliz em poder ajudar
peterretief
1
para uso simples, você pode fazer após ES6 'SUA_MUTAÇÃO' (estado, {chave1, chave2}) {estado.estado1 = chave1 estado.estado2 = chave2},
pabloRN
3

Eu acho que isso pode ser tão simples, vamos supor que você passará vários parâmetros para sua ação conforme você lê, as ações aceitam apenas dois parâmetros contexte payloadquais são os dados que você deseja passar em ação, então vamos dar um exemplo

Configurando Ação

ao invés de

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

Faz

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

Ação de chamada (despacho)

ao invés de

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

Faz

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

espero que isso ajude

Liberi
fonte