【uniapp】小程序开发:2 安装uni-ui组件库、使用pinia状态管理、自定义http请求

2023-09-13 19:05:35

一、安装uni-ui组件库

1、安装

pnpm i -D sass
pnpm i @dcloudio/uni-ui

2、配置组件自动导入
使用 npm 安装好 uni-ui 之后,需要配置 easycom 规则,让 npm 安装的组件支持 easycom

打开项目根目录下的 pages.json 并添加 easycom 节点:

// pages.json
{
	"easycom": {
		"autoscan": true,
		"custom": {
			// uni-ui 规则如下配置
			"^uni-(.*)": "@dcloudio/uni-ui/lib/uni-$1/uni-$1.vue"
		}
	},
	
	// 其他内容
	pages:[
		// ...
	]
}

3、安装插件

pnpm i -D @uni-helper/uni-ui-types

4、测试使用

随便复制一个组件在页面上面就可以直接使用,比如

<uni-card title="基础卡片" sub-title="副标题" extra="额外信息" thumbnail="https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/unicloudlogo.png">
  <text>这是一个带头像和双标题的基础卡片,此示例展示了一个完整的卡片。</text>
</uni-card>

在这里插入图片描述

二、使用pinia做持久化

1、安装依赖包

pnpm install pinia
pnpm install pinia-plugin-persistedstate

如果启动时遇到错误"hasInjectionContext" is not exported by

可以卸载pinia重新安装指定指定版本

pnpm uninstall pinia
pnpm install pinia@2.0.36

2、编写持久化代码

1)创建src/stores/index.ts,内容如下:

import {createPinia } from 'pinia'
import persist from 'pinia-plugin-persistedstate'

const pinia = createPinia()
// 使用持久化存储插件
pinia.use(persist)
// 默认导出给main.ts使用
export default pinia
// 模块统一导出
export * from './modules/member'

2)编写member模块代码member.ts

// 定义 store
import { defineStore } from "pinia"
import { ref } from "vue"

export const useMemberStore = defineStore('member', () => {

    // 会员信息
    const profile = ref()
    // 保存会员信息
    const setProfile = (val: any) => {
        profile.value = val
    }

    // 清理会员信息
    const clearProfile = () => {
        profile.value = undefined
    }

    return {
        profile,
        setProfile,
        clearProfile,
    }
},
{   // 网页端写法
    // persist:true,
    // 小程序端写法
    persist: {
        storage: {
            getItem(key) {
                return uni.getStorageSync(key)
            },
            setItem(key, value) {
                uni.setStorageSync(key, value)
            }
        }
    }
}
)

3)在main.ts是引入

import { createSSRApp } from "vue";
import App from "./App.vue";
// 导入 pinia 实例
import pinia from "./stores";

export function createApp() {
  const app = createSSRApp(App);
  // 使用pinia
  app.use(pinia)
  return {
    app,
  };
}

3、在组件页面中使用

<template>
  <view class="content">
    <view>会员信息:{{ memberStore.profile }}</view>
    <button  plain size="mini" type="primary"
      @click="memberStore.setProfile({
        nickname:'我是管理员',
      })"
    >保存用户信息</button>
    <button  plain size="mini" type="warn"
      @click="memberStore.clearProfile()"
    >清空用户信息</button>
  </view>
</template>

<script setup lang="ts">
import { useMemberStore } from '@/stores';
const memberStore = useMemberStore()
</script>

<style>
.content {
  margin: 10px;
}
</style>

在这里插入图片描述

三、拦截http请求,处理请求参数,请求结果

1、增加请求拦截器,增加请求基础地址、增加自定义请求头、请求token、设置请求超时;
2、自定义http请求方法,处理请求响应结果数据,根据不同的返回代码处理响应结果

import { useMemberStore } from "@/stores";

const baseUrl = "http://127.0.0.1:8080"

const httpInterceptor = {
    // 拦截前触发
    invoke(options: UniApp.RequestOptions) {
        // 1. 增加基础地址
        if (!options.url.startsWith('http')) {
            options.url = baseUrl + options.url
        }
        // 2. 修改超时时间,默认 60s
        options.timeout = 30000
        // 3. 添加请求头
        options.header = {
            ...options.header,
            'source': 'mimiapp'
        }
        // 4. 添加token
        const memberStore = useMemberStore()
        const token = memberStore.profile?.token
        if (token) {
            options.header.Authorization = token
        }
        console.log(options);
    }
}
uni.addInterceptor('request', httpInterceptor)
uni.addInterceptor('uploadFile', httpInterceptor)
interface Resp<T> {
    code: string,
    message: string,
    result: T
}
/**
 * 请求函数
 */
export const http = <T>(options: UniApp.RequestOptions) => {
    // 1. 返回Promise对象
    return new Promise<Resp<T>>((resolve, reject) => {
        uni.request({
            ...options,
            //2. 响应成功
            success(res) {
                if (res.statusCode == 200 && res.statusCode < 300) {
                    resolve(res.data as Resp<T>)
                } else if (res.statusCode == 401) {
                    // 401错误 没有权限,跳转到登录页面
                    const memberStore = useMemberStore()
                    memberStore.clearProfile()
                    uni.navigateTo({ url: '/pages/login/login' })
                    reject(res)
                } else {
                    // 其他错误 根据错误信息提示
                    uni.showToast({
                        title: (res.data as Resp<T>).message || '请求错误',
                        icon: 'none',
                        mask: true
                    })
                    reject(res)
                }
            },
            // 响应失败
            fail(res) {
                uni.showToast({
                    title: res.errMsg,
                    icon: 'none',
                    mask: true
                })
                reject(res)
            },
        })
    })
}

在页面中使用

import {http} from '@/utils/http'
const getData =async ()=>{
 const res = await http<string[]>({
    url:'/api/user/login',
    method:'POST',
    data: {
      "loginName": "user",
      "password": "123"
    }
  })
  console.log(res);
}
更多推荐

[每周一更]-(第63期):Linux-nsenter命令使用说明

nsenter命令是一个可以在指定进程的命令空间下运行指定程序的命令。它位于util-linux包中。1、用途一个最典型的用途就是进入容器的网络命令空间。相当多的容器为了轻量级,是不包含较为基础的命令的,比如说ipaddress,ping,telnet,ss,tcpdump等等命令,这就给调试容器网络带来相当大的困扰:

HTTP 响应头Cache-Control

每个资源都可以通过Http头Cache-Control来定义自己的缓存策略,Cache-Control控制谁在什么条件下可以缓存响应以及可以缓存多久。最快的请求是不必与服务器进行通信的请求:通过响应的本地副本,我们可以避免所有的网络延迟以及数据传输的数据成本。为此,HTTP规范允许服务器返回一系列不同的Cache-Co

【Python】PySpark 数据计算 ④ ( RDD#filter 方法 - 过滤 RDD 中的元素 | RDD#distinct 方法 - 对 RDD 中的元素去重 )

文章目录一、RDD#filter方法1、RDD#filter方法简介2、RDD#filter函数语法3、代码示例-RDD#filter方法示例二、RDD#distinct方法1、RDD#distinct方法简介2、代码示例-RDD#distinct方法示例一、RDD#filter方法1、RDD#filter方法简介RD

MySQL-MHA

1、什么是MHAMHA(MasterHighAvailability)是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。MHA的出现就是解决MySQL单点的问题。MySQL故障切换过程中,MHA能做到0-30秒内自动完成故障切换操作。MHA能在故障切换的过程中最大程度上保证数据的一致性,以达到真正意义上的高可

UVA-1343 旋转游戏 题解答案代码 算法竞赛入门经典第二版

GitHub-jzplp/aoapc-UVA-Answer:算法竞赛入门经典例题和习题答案刘汝佳第二版题目其实不难,但是耗费了我较多时间。这种题关键就是在于找到约束条件,我在DFS的基础上,试了很多种策略:1.对3种数字,每种数字递归遍历一次,这样每次只需要关注一种数字的变化,情况更少。2.使用一个longlong类型

如何自动获取短信验证码?

点击下方关注我,然后右上角点击...“设为星标”,就能第一时间收到更新推送啦~~~这篇文章通过解决实际项目开发中遇到的如何自动获取短信验证码的问题,进一步讲述在Java中如何使用正则。Java中如何使用正则Java中正则相关类位于java.util.regex包下,主要使用2个类,如下:Pattern类:Pattern

tokio::net学习

tokio::net该模块包含TCP/UDP/Unix网络类型,类似于标准库,可用于实现网络协议。networkingprotocolsOrganizationTcpListenerandTcpStreamprovidefunctionalityforcommunicationoverTCPUdpSocketprovi

自己实现 SpringMVC 底层机制 系列之-实现任务阶段 7- 完成简单视图解析

😀前言自己实现SpringMVC底层机制系列之-实现任务阶段7-完成简单视图解析🏠个人主页:尘觉主页🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉😉在csdn获奖荣誉:🏆csdn城市之星2名⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣💓Java全栈群星计

卷积神经网络中的 Full、Same 和 Valid 卷积

文章目录卷积神经网络概述Full卷积Same卷积Valid卷积卷积模式的选择代码示例结论🎉欢迎来到AIGC人工智能专栏~卷积神经网络中的Full、Same和Valid卷积☆*o(≧▽≦)o*☆嗨~我是IT·陈寒🍹✨博客主页:IT·陈寒的博客🎈该系列文章专栏:AIGC人工智能📜其他专栏:Java学习路线Java面

自己实现 SpringMVC 底层机制 系列之-实现任务阶段 4- 完成自定义@Service 注解功能

😀前言自己实现SpringMVC底层机制系列之-实现任务阶段4-完成自定义@Service注解功能🏠个人主页:尘觉主页🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉😉在csdn获奖荣誉:🏆csdn城市之星2名⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣💓

多目标优化算法:基于非支配排序的小龙虾优化算法(NSCOA)MATLAB

一、小龙虾优化算法COA小龙虾优化算法(Crayfshoptimizationalgorithm,COA)由JiaHeming等人于2023年提出,该算法模拟小龙虾的避暑、竞争和觅食行为,具有搜索速度快,搜索能力强,能够有效平衡全局搜索和局部搜索的能力。小龙虾是一种形状类似于虾的甲壳类动物,其甲壳坚硬且颜色丰富。成体的

热文推荐