摘要:在服務(wù)端異步調(diào)用獲取的數(shù)據(jù)會超出服務(wù)器渲染生命周期。解決方案用上狀態(tài)管理方法類似于,不同在于提交的是,而不是直接變更狀態(tài)??梢园我猱惒讲僮?。在這種情況下,只有當(dāng)所有觸發(fā)函數(shù)完成后,返回的才會執(zhí)行。
vue在服務(wù)端異步調(diào)用API獲取的數(shù)據(jù)會超出服務(wù)器渲染生命周期。
解決方案用上vuex狀態(tài)管理
Actions方法
Action 類似于 mutation,不同在于:
**Action 提交的是 mutation,而不是直接變更狀態(tài)。
Action 可以包含任意異步操作。
讓我們來注冊一個簡單的 action:**
const store = new Vuex.Store({ state: { count: 0 }, mutations: { increment (state) { state.count++ } }, actions: { increment (context) { context.commit("increment") } } })
Action 函數(shù)接受一個與 store 實例具有相同方法和屬性的 context 對象,因此你可以調(diào)用 context.commit 提交一個 mutation,或者通過 context.state 和 context.getters 來獲取 state 和 getters。當(dāng)我們在之后介紹到 Modules 時,你就知道 context 對象為什么不是 store 實例本身了。
實踐中,我們會經(jīng)常會用到 ES2015 的 參數(shù)解構(gòu) 來簡化代碼(特別是我們需要調(diào)用 commit 很多次的時候):
actions: { increment ({ commit }) { commit("increment") } }
分發(fā) Action
Action 通過 store.dispatch 方法觸發(fā):
store.dispatch("increment")
乍一眼看上去感覺多此一舉,我們直接分發(fā) mutation 豈不更方便?實際上并非如此,還記得 mutation 必須同步執(zhí)行這個限制么?Action 就不受約束!我們可以在 action 內(nèi)部執(zhí)行異步操作:
actions: { incrementAsync ({ commit }) { setTimeout(() => { commit("increment") }, 1000) } }
Actions 支持同樣的載荷方式和對象方式進行分發(fā):
// 以載荷形式分發(fā) store.dispatch("incrementAsync", { amount: 10 }) // 以對象形式分發(fā) store.dispatch({ type: "incrementAsync", amount: 10 })
來看一個更加實際的購物車示例,涉及到調(diào)用異步 API 和 分發(fā)多重 mutations:
actions: { checkout ({ commit, state }, products) { // 把當(dāng)前購物車的物品備份起來 const savedCartItems = [...state.cart.added] // 發(fā)出結(jié)賬請求,然后樂觀地清空購物車 commit(types.CHECKOUT_REQUEST) // 購物 API 接受一個成功回調(diào)和一個失敗回調(diào) shop.buyProducts( products, // 成功操作 () => commit(types.CHECKOUT_SUCCESS), // 失敗操作 () => commit(types.CHECKOUT_FAILURE, savedCartItems) ) } }
注意我們正在進行一系列的異步操作,并且通過提交 mutation 來記錄 action 產(chǎn)生的副作用(即狀態(tài)變更)。
在組件中分發(fā) Action
你在組件中使用 this.$store.dispatch("xxx") 分發(fā) action,或者使用 mapActions 輔助函數(shù)將組件的 methods 映射為 store.dispatch 調(diào)用(需要先在根節(jié)點注入 store):
import { mapActions } from "vuex" export default { // ... methods: { ...mapActions([ "increment" // 映射 this.increment() 為 this.$store.dispatch("increment") ]), ...mapActions({ add: "increment" // 映射 this.add() 為 this.$store.dispatch("increment") }) } }
組合 Actions
Action 通常是異步的,那么如何知道 action 什么時候結(jié)束呢?更重要的是,我們?nèi)绾尾拍芙M合多個 action,以處理更加復(fù)雜的異步流程?
首先,你需要明白 store.dispatch 可以處理被觸發(fā)的action的回調(diào)函數(shù)返回的Promise,并且store.dispatch仍舊返回Promise:
actions: { actionA ({ commit }) { return new Promise((resolve, reject) => { setTimeout(() => { commit("someMutation") resolve() }, 1000) }) } }
現(xiàn)在你可以:
store.dispatch("actionA").then(() => { // ... })
在另外一個 action 中也可以:
actions: { // ... actionB ({ dispatch, commit }) { return dispatch("actionA").then(() => { commit("someOtherMutation") }) } }
最后,如果我們利用 async / await 這個 JavaScript 即將到來的新特性,我們可以像這樣組合 action:
// 假設(shè) getData() 和 getOtherData() 返回的是 Promise actions: { async actionA ({ commit }) { commit("gotData", await getData()) }, async actionB ({ dispatch, commit }) { await dispatch("actionA") // 等待 actionA 完成 commit("gotOtherData", await getOtherData()) } }
一個 store.dispatch 在不同模塊中可以觸發(fā)多個 action 函數(shù)。在這種情況下,只有當(dāng)所有觸發(fā)函數(shù)完成后,返回的 Promise 才會執(zhí)行。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/81588.html
摘要:無需使用服務(wù)器實時動態(tài)編譯,而是使用預(yù)渲染方式,在構(gòu)建時簡單地生成針對特定路由的靜態(tài)文件。與可以部署在任何靜態(tài)文件服務(wù)器上的完全靜態(tài)單頁面應(yīng)用程序不同,服務(wù)器渲染應(yīng)用程序,需要處于運行環(huán)境。更多的服務(wù)器端負載。 目錄結(jié)構(gòu) -no-ssr-demo 未做ssr之前的項目代碼用于對比 -vuecli2ssr 將vuecli生成的項目轉(zhuǎn)為ssr -prerender-demo 使用prer...
摘要:它會檢測出最大靜態(tài)子樹就是不需要動態(tài)性的子樹并且從渲染函數(shù)中萃取出來。這樣在每次重渲染的時候,它就會直接重用完全相同的同時跳過比對。需要注意的是,中的操作必須是同步的,不可以存在異步操作的情況。 新增:哈哈,最近又推出了 vue 的文章,在這里放個鏈接~手把手教你從零寫一個簡單的 VUE 感謝有人看我扯技術(shù),這篇文章主要介紹最近非?;鸬膙ue2前端框架的特點和vue2+vuex2+we...
摘要:它會檢測出最大靜態(tài)子樹就是不需要動態(tài)性的子樹并且從渲染函數(shù)中萃取出來。這樣在每次重渲染的時候,它就會直接重用完全相同的同時跳過比對。需要注意的是,中的操作必須是同步的,不可以存在異步操作的情況。 新增:哈哈,最近又推出了 vue 的文章,在這里放個鏈接~手把手教你從零寫一個簡單的 VUE 感謝有人看我扯技術(shù),這篇文章主要介紹最近非?;鸬膙ue2前端框架的特點和vue2+vuex2+we...
摘要:它會檢測出最大靜態(tài)子樹就是不需要動態(tài)性的子樹并且從渲染函數(shù)中萃取出來。這樣在每次重渲染的時候,它就會直接重用完全相同的同時跳過比對。需要注意的是,中的操作必須是同步的,不可以存在異步操作的情況。 新增:哈哈,最近又推出了 vue 的文章,在這里放個鏈接~手把手教你從零寫一個簡單的 VUE 感謝有人看我扯技術(shù),這篇文章主要介紹最近非?;鸬膙ue2前端框架的特點和vue2+vuex2+we...
摘要:說起,其實早在出現(xiàn)之前,網(wǎng)頁就是在服務(wù)端渲染的。沒有涉及流式渲染組件緩存對的服務(wù)端渲染有更深一步的認識,實際在生產(chǎn)環(huán)境中的應(yīng)用可能還需要考慮很多因素。選擇的服務(wù)端渲染方案,是情理之中的選擇,不是對新技術(shù)的盲目追捧,而是一切為了需要。 作者:威威(滬江前端開發(fā)工程師)本文原創(chuàng),轉(zhuǎn)載請注明作者及出處。 背景 最近, 產(chǎn)品同學(xué)一如往常笑嘻嘻的遞來需求文檔, 縱使內(nèi)心萬般拒絕, 身體倒是很誠實...
閱讀 1409·2021-10-14 09:43
閱讀 1003·2021-09-10 10:51
閱讀 1454·2021-09-01 10:42
閱讀 2200·2019-08-30 15:55
閱讀 594·2019-08-30 15:55
閱讀 2353·2019-08-30 14:21
閱讀 1725·2019-08-30 13:04
閱讀 3476·2019-08-29 13:09