Vuex-将多个参数传递给突变


124

我正在尝试使用vuejs和laravel的护照对用户进行身份验证。

我无法弄清楚如何通过动作将多个参数发送给vuex突变。

-商店-

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

-登录方法-

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



我将非常感谢您提供的任何帮助!

Answers:


172

变异需要两个参数:statepayload,其中商店的当前状态由Vuex本身作为第一个参数传递,第二个参数包含您需要传递的任何参数。

传递多个参数的最简单方法是销毁它们

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

然后,在您的操作中,您可以简单地

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

它不期望第二个参数,它是可选的。
挖出

参数的用途action
Idris Stack

108

简单来说,您需要将有效负载构建到键数组中

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

然后将有效负载直接发送到动作

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

您的动作没有变化

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

在您的变异中,使用键调用值

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

2
谢谢。这正是我想要的
BoundForGlory

我简化了流程,因为我感到困惑,很高兴能够提供帮助
peterretief

1
为简单起见,您可以在ES6'YOUR_MUTATION'(state,{key1,key2}){state.state1 = key1 state.state2 = key2}之后执行
pabloRN

3

我认为这很简单,假设您要在阅读操作时将多个参数传递给操作,那么操作仅接受两个参数contextpayload而您要传递的数据就是您要传递的数据,因此举一个例子

设置动作

代替

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

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

呼叫(调度)动作

代替

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

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

希望这会有所帮助

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.