2017-04-06 76 views
6

在Vuex商店突變中,是否可以訪問getter?考慮下面的例子。在Vuex突變內訪問getter

new Vuex.Store({ 
    state: { 
     question: 'Is it possible to access getters within a Vuex mutation?' 
    }, 
    mutations: { 
     askQuestion(state) { 
      // TODO: Get question from getter here 
      let question = ''; 

      if (question) { 
       // ... 
      } 
     } 
    }, 
    getters: { 
     getQuestion: (state) => { 
      return state.question; 
     } 
    } 
}); 

當然的例子並沒有太大的意義,因爲我可以直接訪問突變內state對象的question財產,但我希望你明白我要做的。也就是說,有條件地操縱狀態。

在突變範圍內,thisundefinedstate參數允許訪問state對象,而不是存儲的其餘部分。

The documentation on mutations沒有提到這樣做的任何事情。

我的猜測是,這是不可能的,除非我錯過了什麼?我猜想另一種方法是在商店之外執行這種邏輯(導致代碼重複)或者實現一個這樣做的動作,因爲動作可以訪問整個商店環境。我非常確定這是一個更好的方法,那就是讓突變專注於實際應該做的事情;改變狀態。這可能是我最終會做的事情,但我只是好奇,如果在突變中訪問getter甚至有可能?

+0

你能也許爲什麼你需要在突變干將詳細點嗎?你說得對,你的例子很容易引用'state.question'。而且,是的,任何基於當前狀態將採取不同*動作*的邏輯都應該在動作中處理。 – thanksd

+1

您可以在操作中訪問getter,因爲操作會將上下文作爲第一個參數。像這樣:actions:{action1:(context,payload)=> {console.log(context.getters.getSomething); }}。不確定你是否可以在突變中做到這一點,因爲突變只能獲得當地的「狀態」。 – wostex

+0

@thanksd因爲我的真實代碼比這個更復雜,我需要檢查一些東西。具體的例子是將產品添加到購物車,並且我想檢查它是否已經存在。我想保留這個邏輯來保持它的清潔。我很確定最好的方法是使用一個動作,但只是好奇,是否有可能在任何原因下訪問突變中的獲取者。 – Andy0708

回答

2

Vuex商店突變方法不提供對獲取者的直接訪問。

這可能是不好的做法,但犯像這樣的突變時,你可以通過一個參考getters

actions: { 
    fooAction({commit, getters}, data) { 
    commit('FOO_MUTATION', {data, getters}) 
    } 
}, 
mutations: { 
    FOO_MUTATION(state, {data, getters}) { 
    console.log(getters); 
    } 
} 
+0

謝謝!我會採取一種更合適的行動。我同意傳球是一種解決方法,但我還沒有想到這一點。感謝您的澄清! :-) – Andy0708