小言_互联网的博客

vue2版本+TS(typescript)+封装api

497人阅读  评论(0)

vue+TS(typescript)+封装api

1、在src下新建一个 utli文件夹 文件夹下新建一个request.ts文件,在此文件里写如如下代码

import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from "axios"
//创建axsio 赋给常量service
 const service:AxiosInstance = axios.create({
   baseURL:'',
   timeout:100000
 });
// 添加请求拦截器
service.interceptors.request.use(function(config:AxiosRequestConfig):AxiosRequestConfig {//config是请求时的配置信息。
  // 在发送请求之前做些什么
  // 设置请求头 携带token
  const token:string | null = localStorage.getItem('token')
  if(token){
    config.headers = config.headers || {}
    config.headers['XXXX'] = token
  }
  return config;
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error);
});
// 添加响应拦截器
service.interceptors.response.use(function (response:AxiosResponse):AxiosResponse {//response参数是响应对象
  // 对响应数据做点什么
  return response;
}, function (error) {
  // 对响应错误做点什么
  return Promise.reject(error);
});
export default service

2、在src下新建一个api文件夹 在api文件夹下新建一个ts文件

import request from '../utli/request'

export const loginApi =(data:{passworld:string,username:string}):Promise<Ajax.AjaxRsp> => request.post('/login',data)


3、在页面中写代码发请求

<template>
  <div class="loginBox">
    <el-form
      :model="ruleForm"
      :rules="rules"
      ref="ruleForm"
      label-width="100px"
      class="demo-ruleForm"
    >
      <el-form-item label="用户名" prop="username">
        <el-input
          v-model="ruleForm.username"
          placeholder="请输入用户名"
        ></el-input>
      </el-form-item>
      <el-form-item label="密码" prop="password">
        <el-input
          type="password"
          v-model="ruleForm.passworld"
          placeholder="请输入密码"
        ></el-input>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="submitForm()"
          >登录</el-button
        >
      </el-form-item>
    </el-form>
  </div>
</template>

<script lang='ts'>
import {Component, Vue, Ref} from 'vue-property-decorator'
import { ElForm } from "element-ui/types/form";
import {loginApi} from '@/api/login'
interface UserInfo{
  username:string,
  passworld:string
}
interface RulesObj  {
  required:boolean,
  message:string,
  trigger:string,
}
@Component({
  components:{}
})
export default class Login extends Vue{
  @Ref('ruleForm') readonly ruleFormRef!:ElForm
  ruleForm:UserInfo={username:"",passworld:""}
  rules:{username:Array<RulesObj>,passworld:Array<RulesObj>}={
    username:[
      {required:true,message:"用户不能为空",trigger:"blur"}
    ],
    passworld:[
      {required:true,message:"密码不能为空",trigger:"blur"}
    ]
  }
  submitForm(formName: string):void{
    this.ruleFormRef.validate(async(valid: boolean) => {
      if(valid){
        // 发送请求
        let res:Ajax.AjaxRsp = await loginApi({
          passworld:this.ruleForm.passworld,
          username:this.ruleForm.username
        })
        if(res.errno===0){
          //存token
        }else{
          this.$message.error(res.errmsg)
        }
      }
    })
  }
}

</script>

<style scoped>
.loginBox {
  width: 500px;
  margin: 50px auto;
}
</style>

ps: 上面代码中用到了一个Ajax.AjaxRsp
此处用到了命名空间
(1)在项目中找到shims-vue.d.ts文件 加上如下代码

  declare global{
    namespace Ajax{
      interface AjaxRsp{
        errno:number,
        errmsg:string,
        data:any
      }
    }
  }

如图:

不用导出 在任何地方就可以使用了


转载:https://blog.csdn.net/qq_43923146/article/details/116160383
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场