2017-05-26 45 views
1

我目前正試圖從Vuex店行動對象中進行API調用時實現共同的任務,我的行動目前看起來是這樣的:什麼是從Vuex商店內實現常見任務的最佳途徑

/** 
 
* check an account activation token 
 
* 
 
*/ 
 
[CHECK_ACTIVATION_TOKEN] ({commit}, payload) { 
 
    Api.checkActivationToken(payload.token).then((response) => { 
 
    if (response.fails()) { 
 
     return commit('NEW_MESSAGE', {message: responses.activation[response.code]}) 
 
    } 
 

 
    return commit('SET_TOKEN') 
 
    }) 
 
}

我進行各種操作中的多個這樣的方法。我希望能夠做的是在每次調用API時提供一個加載器,並在收到響應後再次隱藏它。我可以像這樣實現:

/** 
 
* check an account activation token 
 
* 
 
*/ 
 
[CHECK_ACTIVATION_TOKEN] ({commit}, payload) { 
 
    commit('SHOW_LOADER') 
 
    Api.checkActivationToken(payload.token).then((response) => { 
 
    commit('HIDE_LOADER') 
 
    if (response.fails()) { 
 
     return commit('NEW_MESSAGE', {message: responses.activation[response.code]}) 
 
    } 
 

 
    return commit('SET_TOKEN') 
 
    }) 
 
}

但我需要重複這些SHOW_LOADER/HIDE_LOADER在每個API調用提交。

我想要做的是將此功能集中在某處,以便每次進行API調用時,加載程序的顯示和隱藏都隱含地綁定到調用,而不必每次都包含這些附加行。

爲了清楚起見,實例化的API是位於Axios之上的客戶端層,以便在啓動之前準備好呼叫。我發現我不能直接將商店導入到客戶層或Axios事件被觸發(這樣我可以集中在那裏加載器的可見性),因爲我在vuex模塊中實例化了客戶層,因此創建了一個循環引用當我試圖這樣做時,意味着商店以未定義的方式返回。

是我想通過一些鉤子或事件,我還沒有碰到可能做到的可能嗎?

+0

您可以創建一個'中央'行爲,您可以在其中提交加載/加載的突變。此操作可以接收另一個操作名稱(字符串)作爲參數。在你的「加載」提交之間,你可以「調度」你作爲參數傳遞的行爲。但對於異步任務,關閉提交將無法按預期工作。我想你可以讓它工作,如果你的行爲返回一個Promise,這樣你就可以在回調中調用關閉提交。 – wostex

+0

是的,我相信這是我目前所擁有的,加載模塊在調用時接受字符串SHOW/HIDE,但我仍然需要每次都進行「手動」調用。我需要通過每次顯式傳遞它(不解決問題)或通過其他一些將SHOW/HIDE綁定到事件的鉤子來將API訪問權授予商店。我還沒有找到一種做這些事情的有效方法。 – user1728296

回答

1

在閱讀this GitHub線程和Evan You的迴應後,我實際上採用了與此「問題」不同的途徑,他談論瞭解耦。

最終,我決定通過強制API層直接瞭解商店,我將這兩件事緊密結合在一起。因此,我現在處理的顯示和隱藏功能,我在每個地方的商店提交製成,像這樣的組件在尋找:

/** 
 
    * check the validity of the reset token 
 
    * 
 
    */ 
 
    checkToken() { 
 
     if (!this.token) { 
 
     return this.$store.commit('NEW_MESSAGE', {message: 'No activation token found. Unable to continue'}) 
 
     } 
 

 
     this.showLoader() 
 

 
     this.$store.dispatch('CHECK_ACTIVATION_TOKEN', {token: this.token}).then(this.hideLoader) 
 
    },

在這裏,我已經定義了快捷的Vuex方法在我的每個組件都會擴展的Master vue組件中提交。然後在需要時調用showLoader並使用promise來確定何時完成該過程並在那裏調用hideLoader。

這意味着我已經從商店和API層中移除了演示邏輯,並將它們保留在邏輯上屬於他們的地方。

如果有人對此有任何更好的想法,我全力以赴。

@wostex - 感謝您的回覆!

+0

對於您的情況,這似乎是一個更好的方法,感謝分享。我認爲這取決於一個項目。例如,我製作了一個應用程序,其中有幾個組件注入一個「加載狀態」獲取器,以決定目前要顯示哪些模板/圖標。 '加載狀態'是由一個昂貴的API調用的動作設置的。在這種情況下,最好將「加載」提交放在一個操作中,因爲它們依賴於此操作,並且代碼少於將許多組件中的相同突變合併在一起。 – wostex

+0

是的睡在它我回到你建議的想法。將所有提交的事情都與你正在封裝的事情做在一起,似乎比讓它們在整個組件中重複(分散)更合適。我想我會沿着這條路線走下去,看看它是如何擺脫的。 – user1728296