uniapp + ts + vue3 发送请求方案

uniapp + ts + vue3 发送请求方案

当你使用 uniapp 开发一个前端项目时,你可能需要向后端发送 HTTP 请求获取数据并在页面中显示。如果你也在使用 ts 编写代码并使用 vue3 来构建组件的话,下面是一个完整的发送 HTTP 请求的方案。
需要安装依赖 luch-request

安装依赖

pnpm add luch-request --save

创建d.ts 全局文件

d.ts 文件就是ts全局可以使用的类型

declare namespace Api {
	// 这个需要根据后端统一的 返回格式做修改
    interface BasicInstance {
        code: number;
        msg: string;
        extras: string;
        time: string;
        url?: string;
    }
    // 一样的,根据后端格式,比如有的后端会统一把数据放到 data 里,有的会放在 rows 里,调整即可
    interface Response<T> extends BasicInstance {
        data: T;
    }
    // 自定义配置,是否显示请求loading
    interface Config {
        notLoading: boolean;
    }
    // 分页配置
    interface Pagination<T = any> {
        code: number;
        msg: boolean;
        rows: T;
        total: number;
    }
}


封装全局请求入口

在根目录中创建 api 文件夹,添加 request.ts 文件

import HttpRequest from "luch-request";
import { useAccountStore } from "@/store/useAccountStore";
import { Oops } from "@/hooks/Oops";
import { To } from "@/hooks/To";
import type { HttpRequestConfig, HttpResponse, HttpError, HttpTask } from "luch-request";

export const BASE_URL = "https://your.services.address.cn";

const requestInstence = new HttpRequest({
    baseURL: BASE_URL,
    timeout: 10 * 1000,
    header: {
        "Content-Type": "application/json;charset=utf-8"
    }
});

requestInstence.interceptors.request.use(
    (config: HttpRequestConfig) => {
        const accountStore = useAccountStore();
        const {
            custom: { notLoading }
        } = config as HttpRequestConfig & { custom: Api.Config };
        // 默认需要Loading。。。
        notLoading || uni.showLoading({ title: "加载中...", mask: true });
        config.header = { ...config.header, Authorization: `Bearer ${accountStore.Token}` };
        return config;
    },
    (error: HttpRequestConfig<HttpTask> | HttpError) => Promise.reject(error)
);

requestInstence.interceptors.response.use(
    (response: HttpResponse) => {
        const accountStore = useAccountStore();
        uni.hideLoading();
        const { data } = response;

        if (data.code === 401) {
            accountStore.clearToken();
            uni.showModal({
                title: "提示",
                content: "身份认证失败,将跳转登录!",
                showCancel: false,
                success: (res) => {
                    if (res.confirm) {
                        To.go("/pages/login/index", { type: "reLaunch" });
                    }
                }
            });
        }
        return PoorCode200(data.code) && data;
    },
    (error: HttpError) => {
        uni.hideLoading();
        Oops.oh("网络君出小差了...");
        return Promise.reject(error);
    }
);

const PoorCode200 = (CODE: number) => CODE === 200 || 500;

export default requestInstence;


封装全局请求方法

有了上面的入口文件之后即可封装统一请求方法,也就是 get, post
api文件夹中创建 index.ts文件
可以看到 get 方法有连个参数,第二个为非必填,post 有三个参数,后两个为非必填,这里需要注意一下,第二个参数是提交的data

import http, { BASE_URL } from "./request";
import { useAccountStore } from "@/store/useAccountStore";

export type HttpData = Record<string | number | symbol, unknown>;

export const get = <T>(url: string, config?: Api.Config): Promise<Api.Response<T>> => http.get<T, Api.Response<T>>(url, { custom: config });

export function post<T>(url: string, data?: HttpData | ArrayBuffer, config?: Api.Config): Promise<Api.Response<T>> {
    return http.post<T, Api.Response<T>>(url, data, { custom: config });
}

export function put<T>(url: string, data?: HttpData | ArrayBuffer, config?: Api.Config): Promise<Api.Response<T>> {
    return http.put<T, Api.Response<T>>(url, data, { custom: config });
}

export function del<T>(url: string, config?: Api.Config): Promise<Api.Response<T>> {
    return http.delete<T, Api.Response<T>>(url, { custom: config });
}

export function upload(tempPath: string): Promise<Api.BasicInstance> {
    const accountStore = useAccountStore();
    return new Promise((resolve) => {
        uni.uploadFile({
            url: `${BASE_URL}/common/upload`,
            filePath: tempPath,
            header: {
                Authorization: `Bearer ${accountStore.Token}`
            },
            name: "file",
            success: (res) => {
                const { data, statusCode } = res;
                if (statusCode === 200) {
                    return resolve(JSON.parse(data));
                }
            }
        });
    });
}

使用

在页面中使用的时候,只需要导入传入参数即可
import { get } from "@/api"

const getData = async () => {
	// 这里使用了自定义配置,不需要loading,直接这样传就可以了,去掉的话默认是有全局loading的
    const res = await get<BasicStatistic>("/system/execution/index", { notLoading: true });
    if (res.code === 200) {
		// 业务代码
    }
};
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
uniapp是一个基于Vue.js的跨平台开发框架,可以用于开发多种类型的应用程序,包括Web、iOS、Android等。Vue3是Vue.js的最新版本,它引入了一些新的特性和改进,使开发更加高效和灵活。而ts表示使用TypeScript进行开发。 要在uniapp中使用Vue3和TypeScript,可以按照以下步骤进行操作: 1. 在命令行中使用Vue CLI创建一个uniapp项目。可以通过以下命令进行安装: ``` vue create -p dcloudio/uni-preset-vue my-project ``` 2. 在项目根目录下进入命令行,并执行以下命令以进入项目: ``` cd my-project ``` 3. 在项目中安装Vue3和TypeScript依赖。可以使用以下命令进行安装: ``` npm install vue@next npm install typescript ts-loader -D ``` 4. 在项目的`src`目录下创建一个`.ts`或`.tsx`文件,这将成为您的Vue组件文件。 5. 在您的组件中,您可以使用Vue3的新特性和语法进行开发,例如使用`<script setup>`语法来简化组件的编写。 6. 您可以使用pinia框架来进行状态管理。可以通过以下步骤安装和使用pinia: - 在项目中安装pinia: ``` npm install pinia ``` - 在您的组件中实例化和使用pinia来管理应用程序的状态。 7. 在开发过程中,您可以使用Vue3的其他特性,如组合式API、Teleport、Suspense等来提高开发效率和应用程序的性能。 通过以上步骤,您就可以在uniapp中使用Vue3和TypeScript进行开发了。如果您需要进一步了解如何使用uniappVue3和TypeScript进行开发,可以参考uniapp官方文档和Vue3官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值