Vue CLI + Axios TypeError: XX is not a function

Posted

技术标签:

【中文标题】Vue CLI + Axios TypeError: XX is not a function【英文标题】: 【发布时间】:2021-05-25 12:29:26 【问题描述】:

我是 Vue.js 的新手,我正在尝试通过 Axios 创建一个带有 HTTP 客户端的 Vue CLI。

我找到了this useful setup,因为我正在制作的项目将相当大,我希望它可以作为模板重复使用。我对其进行了一些更新以适应当前版本,但(很可能)不会导致此错误。

我做了一个服务,扩展自提到的 API 类:

import  AxiosRequestConfig, AxiosResponse  from 'axios';
import  apiConfig  from './config/api.config';
import  Api  from './superclasses/api';

const api = '/portals';

export class PortalService extends Api 
  constructor(config: AxiosRequestConfig) 
    super(config);
  

  public async getPortals(): Promise<AxiosResponse<Portal[]>> 
    return await this.get<Portal, AxiosResponse<Portal[]>>(api);

    // return this.success(portals);
  


export const portalService = new PortalService(apiConfig);

我的问题是,当我在 vue 上下文中使用 portalService 时。它不承认它是一个类。

我有以下 vue 文件,PortalsList.vue:

<template>
  <div class="container">
    <h2>Portals</h2>
    <button @click="getPortals()">Get portals</button>
    <table v-if="portals" class="table table-bordered">
      <thead>
        <tr>
          <th>Portal Id</th>
          <th>Name</th>
          <th>Domain</th>
          <th>File Domain</th>
        </tr>
      </thead>
      <tbody>
        <tr v-for="item in portals" :key="item.id">
          <td> item.id </td>
          <td> item.name </td>
          <td> item.domain </td>
          <td> item.fileDomain </td>
        </tr>
      </tbody>
    </table>
  </div>
</template>

<script lang="ts">
import  Component, Vue  from 'vue-property-decorator';
import  Portal  from '@/interfaces/portal';
import  portalService  from '@/services/portalService';

@Component
export default class PortalsList extends Vue 
  private portals: Portal[] = [];

  public async getPortals() 

    const response = await portalService.getPortals();
    this.portals = response.data;
  

</script>

当我按下“获取门户”按钮时,我在控制台中收到以下错误:

我知道我还有很多东西要学,还有很多信息要查找,但我就是找不到合适的解决方案来解决我的问题,这让我来到了这里。

【问题讨论】:

【参考方案1】:

我找到了问题的答案。该方法不是该类的成员,因为它永远不会绑定到 this。 我使用箭头函数以我能找到的最典型的方式解决了这个问题。简单地在构造函数中绑定给了我另一个错误,然后我发现我还必须更正 Api 类中的某些地方。

生成的portalService.ts 如下所示:

import  Portal  from '@/interfaces/portal';
import  AxiosRequestConfig, AxiosResponse  from 'axios';
import  apiConfig  from './config/api.config';
import  Api  from './superclasses/api';

const api = '/portals';

export class PortalService extends Api 
  constructor(config: AxiosRequestConfig) 
    super(config);
  

  public getPortals = async (): Promise<Portal[]> => 
    const portals = await this.get<Portal, AxiosResponse<Portal[]>>(api);
    return this.success(portals);
  ;


export const portalService = new PortalService(apiConfig);

【讨论】:

以上是关于Vue CLI + Axios TypeError: XX is not a function的主要内容,如果未能解决你的问题,请参考以下文章

vue-cli中使用axios

vue-cli-3.0 axios 安装和配置

vue-cli 引入 axios 并全局配置axios

vue-cli3 axios与后台对接没有成功?

vue-cli整合axios的几种方法

vue的学习之路 vue-cli与axios