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



どんな助けにも感謝します!

回答:


172

突然変異は2つの引数を期待します:statepayload。ストアの現在の状態はVuex自体によって最初の引数として渡され、2番目の引数は渡す必要のあるパラメーターを保持します。

複数のパラメータ渡す最も簡単な方法は、それら破棄することです。

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

その後、あなたの行動の中であなたは簡単にできます

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

それはしません期待する第二引数を、それはオプションです。
digout 2018年

パラメータの目的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

これは単純なことだと思います。アクションを読み取るときに複数のパラメーターをアクションに渡すと仮定すると、アクションは2つのパラメーターしか受け入れず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()
              })

これが役に立てば幸い

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.