学习笔记 | 微信小程序项目day02

今日学习内容

  • 安装uni-ui跟@uni-helper/uni-ui-types
  • 配置pinia持久化
  • 请求工具类的拦截器
  • 请求工具类的请求函数

安装uni-ui跟@uni-helper/uni-ui-types

npm install -g cnpm --registry=https://registry.npmmirror.com
npm set registry https://registry.npmmirror.com
npm i -g pnpm
npm i @dcloudio/uni-ui//配置ts类型
pnpm i -D @uni-helper/uni-ui-types

配置uni-ui自动导入

设置pinia持久化

1、新建stores/index.ts

import { createPinia } from 'pinia'
import persist from 'pinia-plugin-persistedstate'// 创建 pinia 实例
const pinia = createPinia()
// 使用持久化存储插件
pinia.use(persist)// 默认导出,给 main.ts 使用
export default pinia// 模块统一导出
export * from './modules/member'

2、在新建store的时候加上持久化的配置

import { defineStore } from 'pinia'
import { ref } from 'vue'// 定义 Store
export const useMemberStore = defineStore('member',() => {// 会员信息const profile = ref<any>()// 保存会员信息,登录时使用const setProfile = (val: any) => {profile.value = val}// 清理会员信息,退出时使用const clearProfile = () => {profile.value = undefined}// 记得 returnreturn {profile,setProfile,clearProfile,}},// TODO: 持久化{//网页端的写法// persist: true,persist: {storage: {getItem(key) {return uni.getStorageSync(key)},setItem(key, value) {uni.setStorageSync(key, value)},},},},
)

请求工具类的拦截器

配置拦截器并添加

import { useMemberStore } from "@/stores"//api请求地址
const apiUrl = 'https://pcapi-xiaotuxian-front-devtest.itheima.net'//初始化拦截器配置
const httpInterceptor = {//拦截前触发invoke(options: UniApp.RequestOptions) {//如果不是http请求开头的则需要拼接apiUrlif (!options.url.startsWith('http')) {options.url = apiUrl + options.url}//配置请求超时时间options.timeout = 10 * 1000//添加请求头options.header = {...options.header,'source-client': 'miniapp'}//添加tokenconst memberStore = useMemberStore()const token = memberStore.profile?.tokenif (token) {options.header.Authorization = token}}
}//添加拦截器  request uploadFile   httpInterceptor是配置
uni.addInterceptor('request', httpInterceptor)
uni.addInterceptor('uploadFile', httpInterceptor)

使用

<script setup lang="ts">
import { useMemberStore } from '@/stores'
import '@/utils/http'const memberStore = useMemberStore()const getData = () => {uni.request({method: 'GET',url: '/category/top',header: {},})
}</script><template><view class="my"><view>会员信息:{{ memberStore.profile }}</view><button @tap="memberStore.setProfile({nickname: '黑马先锋',token: '123'})" size="mini" plain type="primary">保存用户信息</button><button @tap="memberStore.clearProfile()" size="mini" plain type="warn">清理用户信息</button><button @tap="getData()" size="mini" plain type="warn">发起请求</button></view>
</template><style lang="scss">
//
</style>

请求工具类的请求函数

import { useMemberStore } from '@/stores'//api请求地址
const apiUrl = 'https://pcapi-xiaotuxian-front-devtest.itheima.net'//初始化拦截器配置
const httpInterceptor = {//拦截前触发invoke(options: UniApp.RequestOptions) {//如果不是http请求开头的则需要拼接apiUrlif (!options.url.startsWith('http')) {options.url = apiUrl + options.url}//配置请求超时时间options.timeout = 10 * 1000//添加请求头options.header = {...options.header,'source-client': 'miniapp',}//添加tokenconst memberStore = useMemberStore()const token = memberStore.profile?.tokenif (token) {options.header.Authorization = token}},
}//添加拦截器  request uploadFile   httpInterceptor是配置
uni.addInterceptor('request', httpInterceptor)
uni.addInterceptor('uploadFile', httpInterceptor)//配置请求函数//step.1 先定义出与后端约定返回的数据格式
interface Data<T> {code: stringmsg: stringresult: T
}//step.2 定义出http 使用泛型
export const http = <T>(options: UniApp.RequestOptions) => {//返回Promisereturn new Promise<Data<T>>((resolve, reject) => {uni.request({...options,//step.3 响应成功success(res) {//如果状态码是2xx || 3xx 才会进入resolveif (res.statusCode >= 200 && res.statusCode < 300) {resolve(res.data as Data<T>)} else if (res.statusCode === 401) {//清理用户信息并跳转到登录页const memberStore = useMemberStore()memberStore.clearProfile()//跳转登录页uni.navigateTo({ url: '/pages/login/login' })reject(res)} else {//其他错误,进行提示uni.showToast({title: (res.data as Data<T>).msg || '请求错误',icon: 'none',mask: true})reject(res)}},//step.4 响应失败fail(err) {reject(err)uni.showToast({icon: 'none',title: '网络错误,换个网络试试'})}})})
}

测试请求路径不存在

<script setup lang="ts">
import { useMemberStore } from '@/stores'
import { http } from '@/utils/http'const memberStore = useMemberStore()const getData = async () => {const res = await http<string[]>({method: 'GET',url: '/category/top123',header: {},})console.log(res)
}
</script><template><view class="my"><view>会员信息:{{ memberStore.profile }}</view><button @tap="memberStore.setProfile({nickname: '黑马先锋',token: '123',})" size="mini" plain type="primary">保存用户信息</button><button @tap="memberStore.clearProfile()" size="mini" plain type="warn">清理用户信息</button><button @tap="getData()" size="mini" plain type="warn">发起请求</button></view>
</template><style lang="scss">
//
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/751895.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PC电脑如何使用HDMI连接小米电视当显示屏

使用HDMI连接好当时和电脑&#xff0c;HDMI2.0会更清晰&#xff1b;小米电视会自动弹窗提示你有HDMI 接口连接&#xff0c;或者你进入信号源进行选择即可&#xff1b;需要平时我们电脑的显示器正常连接&#xff0c;然后按 win p &#xff0c;选择 扩展 屏幕&#xff1b; 进入设…

如何通过蓝牙获取手机时间同步时钟RTC万年历走ble或者edr经典蓝牙

一、功能简介 KT6368A支持连接手机获取手机的时间信息&#xff0c;可以同步时钟 无需安装任何app&#xff0c;直接使用系统蓝牙即可实现 走的就是edr的经典蓝牙 同时它不影响音频蓝牙&#xff0c;还能保持低功耗的运行 实现的方式就是手机连接好蓝牙芯片KT6368A&#xff0…

R语言聚类分析-K均值聚类与系统聚类法

一、数据集为firm.csv&#xff0c;给出了22家美国公用事业公司的相关数据集&#xff0c;各数据集变量的名称和含义如下&#xff1a;X1为固定费用周转比&#xff08;收入/债务&#xff09;&#xff0c;X2为资本回报率&#xff0c;X3为每千瓦容量成本&#xff0c;X4为年载荷因子&…

Etcd 介绍与使用(入门篇)

etcd 介绍 etcd 简介 etc &#xff08;基于 Go 语言实现&#xff09;在 Linux 系统中是配置文件目录名&#xff1b;etcd 就是配置服务&#xff1b; etcd 诞生于 CoreOS 公司&#xff0c;最初用于解决集群管理系统中 os 升级时的分布式并发控制、配置文件的存储与分发等问题。基…

使用 GitHub Actions 通过 CI/CD 简化 Flutter 应用程序开发

在快节奏的移动应用程序开发世界中&#xff0c;速度、可靠性和效率是决定项目成功或失败的关键因素。持续集成和持续部署 (CI/CD) 实践已成为确保满足这些方面的强大工具。当与流行的跨平台框架 Flutter 和 GitHub Actions 的自动化功能相结合时&#xff0c;开发人员可以创建无…

Selenium笔记

Selenium笔记 Selenium笔记 Selenium笔记element not interactable页面刷新 element not interactable "element not interactable"是Selenium在执行与网页元素交互操作&#xff08;如点击、输入等&#xff09;时抛出的一个常见错误。这个错误意味着虽然找到了对应的…

MySQL_数据库图形化界面软件_00000_00001

目录 NavicatSQLyogDBeaverMySQL Workbench可能出现的问题 Navicat 官网地址&#xff1a; 英文&#xff1a;https://www.navicat.com 中文&#xff1a;https://www.navicat.com.cn SQLyog 官网地址&#xff1a; 英文&#xff1a;https://webyog.com DBeaver 官网地址&…

RabbitMQ——死信队列和延迟队列

文章目录 RabbitMQ——死信队列和延迟队列1、死信队列2、基于插件的延迟队列2.1、安装延迟队列插件2.2、代码实例 RabbitMQ——死信队列和延迟队列 1、死信队列 死信队列&#xff08;Dead Letter Queue&#xff0c;DLQ&#xff09;是 RabbitMQ 中的一种重要特性&#xff0c;用…

FreeRTOS入门基础

RTOS是为了更好地在嵌入式系统上实现多任务处理和时间敏感任务而设计的系统。它能确保任务在指定或预期的时间内得到处理。FreeRTOS是一款免费开源的RTOS&#xff0c;它广泛用于需要小型、预测性强、灵活系统的嵌入式设备。 创建第一个任务 任务函数&#xff1a;任务是通过函数…

python的集合应用

在Python中&#xff0c;集合是一种无序、可变的数据类型&#xff0c;用于存储不重复的元素。Python提供了内置的集合类型 set&#xff0c;以及 frozenset&#xff08;不可变的集合&#xff09;。以下是一些Python集合的常见应用场景&#xff1a; 去重&#xff1a; 集合是存储唯…

ChatGPT:论文写作的新潮解决方案

ChatGPT无限次数:点击直达 摘要&#xff1a; 本文介绍了一种新潮的论文写作解决方案——ChatGPT。ChatGPT是基于模型的自然语言处理技术&#xff0c;它通过生成人类般的语言来帮助用户撰写高质量的论文。本文通过多个示例演示了ChatGPT的强大功能&#xff0c;并探讨了其在论文写…

Spark 用AnyFunSuite单元测试Scala详细教程

在用java开发时&#xff0c;通过用Junit框架来测试&#xff0c;在用spark开发scala时&#xff0c;除了可以用Junit&#xff0c;还可以用AnyFunSuite&#xff0c;无需依赖AnyFunSuite。 步骤一&#xff1a;设置项目依赖 确保您的项目中包含了以下必要的依赖&#xff1a; <d…

【HTML】HTML表单8.2(表单标签2)

目录 接上期&#xff0c;大致实现效果 文章简要 注释&#xff1a;这一次介绍的很多效果需要后期与服务器配合&#xff0c;但我们这里先只介绍效果 ①提交按钮 ②获取验证码 ③上传文件 ④还原所有表单内容 ⑤下拉表单 ⑥文字域 接上期&#xff0c;大致实现效果 文章简要 注…

matlab中Signal Editor定义梯形信号输出矩形信号

matlab中Signal Editor定义梯形信号输出矩形信号&#xff0c;可以通过如下勾选差值数据实现梯形信号输出。

GPT-1, GPT-2, GPT-3, InstructGPT / ChatGPT and GPT-4 总结

1. GPT-1 What the problem GPT-1 solve? 在 GPT-1 之前&#xff0c;NLP 通常是一种监督模型。 对于每个任务&#xff0c;都有一些标记数据&#xff0c;然后根据这些标记数据开发监督模型。 这种方法存在几个问题&#xff1a;首先&#xff0c;需要标记数据。 但 NLP 不像 CV&…

云原生部署手册02:将本地应用部署至k8s集群

&#xff08;一&#xff09;部署集群镜像仓库 1. 集群配置 首先看一下集群配置&#xff1a; (base) ➜ ~ multipass ls Name State IPv4 Image master Running 192.168.64.5 Ubuntu 22.04 LTS1…

栈队列数组试题(四)——数组和特殊矩阵

01&#xff0e;对特殊矩阵采用压缩存储的主要目的是( D ). A.表达变得简单 B.对矩阵元素的存取变得简单 C.去掉矩阵中的多余元素 D.减少不必要的存储空间解析&#xff1a;特殊矩阵中含有很多相同元素…

Pyqt5专栏目录索引

文章目录 安装 Pyqt5 和 DesignerQt Designer教程Qt 官方文档及阅读方法主窗口按键&#xff08;Buttons&#xff09;项目视图&#xff08;Item Views&#xff09;输入控件&#xff08;Input Widgets&#xff09;显示控件&#xff08;Display Widgets&#xff09;弹出框音频播放…

iOS——【Blocks】

Blocks概要 Blocks是C语言的扩充功能&#xff0c;即带有自动变量的匿名函数。匿名函数就是不带函数名的函数。这一概念同样被称为“闭包”&#xff0c;lambda计算等。 自动变量是在函数内部声明的变量&#xff0c;其作用域仅限于声明它的函数内部。这意味着它们只能在其声明的…

一. 并行处理与GPU体系架构-GPU并行处理

目录 前言0. 简述1. 这个小节会涉及到的关键字2. CPU与GPU在并行处理的优化方向3. Summary总结参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习下课程第一章——并行处理与GPU体…