vue.js - Vue - API 调用属于 Vuex 吗?

标签 vue.js axios vuex

我正在努力寻找将 API 调用理想地放置在 vue 模块中的位置的答案。我不是在构建 SPA。例如,我的 auth block 有几个组件用于登录、密码重置、帐户验证等。每个 block 都使用 axios 进行 API 调用。 Axios 已经提供了异步的 promise 。

问题是关于最佳实践的。 API 调用是否属于 Vuex 操作?这种方法有什么优点/缺点吗?

将 axios 调用保留在它们所属的组件中有什么缺点吗?

最佳答案

我在服务中进行 API 调用,而不是 Vuex 或组件。基本上,将 API 调用与商店代码混合在一起有点过于多重责任,组件应该提供 View 而不是获取数据。

作为一个简单服务的示例(使用 Vue.http 但同样适用于 Axios 调用),

文件服务.js

import Vue from 'vue'

export default {
  getFileList () {
    return Vue.http.get('filelist.txt')
      .then(response => {
        // massage the response here
        return filelist;
      })
      .catch(err => console.error('getFileList() failed', err) )
  },
}

我在另一个服务中使用它,如下所示(层数由您决定)。
请注意,外部服务正在检查存储以查看提取是否已经发生。

DataService.js

import FileService from './file.service'

checkFiles (page) {
  const files = store.state.pages.files[page]
  if (!files || !files.length) {
    return store.dispatch('waitForFetch', {
      resource: 'files/' + page,
      fetch: () => FileService.getFileList(),
    })
  } else {
    return Promise.resolve()  // eslint-disable-line no-undef
  }
},

waitForFetch 是调用传递给它的提取函数的操作(由 FileService 提供)。它基本上为获取提供包装器服务,例如超时以及根据结果分派(dispatch)成功和失败操作。

组件永远不知道 API 结果(尽管它可能会启动它),它只是等待数据出现在商店中。


至于仅在组件中调用 API 的缺点,这取决于可测试性、应用程序复杂性。和团队规模。

  • 可测试性 - 可以在单元测试中模拟服务。
  • 应用复杂性 - 可以与 API 调用正交地处理超时/成功/失败。
  • 团队规模 - 更大的团队,将任务分成更小的部分。

关于vue.js - Vue - API 调用属于 Vuex 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48494196/

相关文章:

javascript - 当我的 Vue 应用程序无法在 IE11 上呈现时,如何显示免责声明屏幕?

vue.js - Vue DOM 对计算属性没有反应

javascript - 如何增加/减少购物车中产品的数量?

node.js - 无法捕获并记录来自 axios 请求的错误响应

javascript - 无法在 react-native 中发送表单数据

vuex - Vue 组合 API 与 Vuex(各自的优点并找到适合我们的)

javascript - Vuex插件错误

vue.js - Amplify Vue amplify-authenticator 组件不显示

javascript - VueJS : Property or method . ..未在实例上定义,但在渲染期间引用

javascript - 在挂载的钩子(Hook)函数中初始化Viewer.js。 (错误 : The first argument is required and must be an element)