Vuex

Vue 从去年开始大热,越来越多同学借助其全家桶进行开发。其中,Vuex 负责状态管理,换言之,在复杂应用中,Vuex 通常作为全局的数据中心。

如果您还不熟悉 Vuex,可以阅读它的官方文档

Vuex 要求开发者使用显式的方式修改数据。对立刻生效的修改,调用 stat.commit(type, payload) 提交;对需要异步数据交互之后才能生效的修改,通过 stat.dispatch(type, payload) 提交。

比如说,一个电商网站,有限量促销商品,库存很少,于是很容易发生用户下单时才发现被抢空的情况。这个时候,系统就需要帮助用户重新加载促销商品。同时,还要给出相应提示。换言之,我们不仅需要提交异步修改,还要知道异步修改是什么时候完成的。

一方面,可以通过监测特定属性,也就是借助 vm.$watch 来进行。不过这种方式很难区分前置条件,比如我们可以 .$watch 商品列表,但是商品列表有好几种原因会刷新,如果都写在一起,逻辑就很分裂。另一种方法,利用 stat.dispatch 会返回对应 action 函数的返回值的特性,可以直接返回代理异步操作的 Promise,这样我们就可以给出适当的提示了。

// buy.js
api.checkProduct(productId) // 检查商品是否还在
  .then( response => {
    if (response.code === 0) {
      return api.checkout(); // 正常,结账
    }
    throw new Error(response.code);
  })
  .catch( err => { // 没了
    if (err.message === NO_MORE_PRODUCT) {
      let popup = PopupManager.alert('您要购买的商品已售空,正为您查找其它的促销商品....');
      this.$store.dispatch(ActionTypes.REFETCH_SALES)
        .then(response => {
          popup.msg = '已重新获取促销商品,请尽快选购';
          popup.state = PopupManager.READY;
        });
    }
  });

// action.js
[ActionTypes.REFETCH_SALES] ({commit, state}) {
  state.isFetching = true;
  return api.fetch() // 要点:这里的 Promise 会返回给 dispatch 的地方
    .then(json => {
      commit(MutationTypes.RESET_PRODUCT_LIST, json);
    });
}

results matching ""

    No results matching ""