成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

vue2 ssr node服務(wù)端渲染異步操作調(diào)取API的問題

CoXie / 665人閱讀

摘要:在服務(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

相關(guān)文章

  • vue服務(wù)渲染demo將vue-cli生成項目轉(zhuǎn)為ssr

    摘要:無需使用服務(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...

    whinc 評論0 收藏0
  • 無痛學(xué)會各種 2 Vue2+Vuex2+Webpack2 前后同構(gòu)渲染

    摘要:它會檢測出最大靜態(tài)子樹就是不需要動態(tài)性的子樹并且從渲染函數(shù)中萃取出來。這樣在每次重渲染的時候,它就會直接重用完全相同的同時跳過比對。需要注意的是,中的操作必須是同步的,不可以存在異步操作的情況。 新增:哈哈,最近又推出了 vue 的文章,在這里放個鏈接~手把手教你從零寫一個簡單的 VUE 感謝有人看我扯技術(shù),這篇文章主要介紹最近非?;鸬膙ue2前端框架的特點和vue2+vuex2+we...

    fish 評論0 收藏0
  • 無痛學(xué)會各種 2 Vue2+Vuex2+Webpack2 前后同構(gòu)渲染

    摘要:它會檢測出最大靜態(tài)子樹就是不需要動態(tài)性的子樹并且從渲染函數(shù)中萃取出來。這樣在每次重渲染的時候,它就會直接重用完全相同的同時跳過比對。需要注意的是,中的操作必須是同步的,不可以存在異步操作的情況。 新增:哈哈,最近又推出了 vue 的文章,在這里放個鏈接~手把手教你從零寫一個簡單的 VUE 感謝有人看我扯技術(shù),這篇文章主要介紹最近非?;鸬膙ue2前端框架的特點和vue2+vuex2+we...

    30e8336b8229 評論0 收藏0
  • 無痛學(xué)會各種 2 Vue2+Vuex2+Webpack2 前后同構(gòu)渲染

    摘要:它會檢測出最大靜態(tài)子樹就是不需要動態(tài)性的子樹并且從渲染函數(shù)中萃取出來。這樣在每次重渲染的時候,它就會直接重用完全相同的同時跳過比對。需要注意的是,中的操作必須是同步的,不可以存在異步操作的情況。 新增:哈哈,最近又推出了 vue 的文章,在這里放個鏈接~手把手教你從零寫一個簡單的 VUE 感謝有人看我扯技術(shù),這篇文章主要介紹最近非?;鸬膙ue2前端框架的特點和vue2+vuex2+we...

    Pluser 評論0 收藏0
  • Vue.js 服務(wù)渲染業(yè)務(wù)入門實踐

    摘要:說起,其實早在出現(xiàn)之前,網(wǎng)頁就是在服務(wù)端渲染的。沒有涉及流式渲染組件緩存對的服務(wù)端渲染有更深一步的認識,實際在生產(chǎn)環(huán)境中的應(yīng)用可能還需要考慮很多因素。選擇的服務(wù)端渲染方案,是情理之中的選擇,不是對新技術(shù)的盲目追捧,而是一切為了需要。 作者:威威(滬江前端開發(fā)工程師)本文原創(chuàng),轉(zhuǎn)載請注明作者及出處。 背景 最近, 產(chǎn)品同學(xué)一如往常笑嘻嘻的遞來需求文檔, 縱使內(nèi)心萬般拒絕, 身體倒是很誠實...

    miya 評論0 收藏0

發(fā)表評論

0條評論

CoXie

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<