Uniapp的学习

uniapp的内容和vue网页开发会有很多区别,但是都是基于vue开发的,大多数业务还是在vue打交道,但是这些uniapp的特殊的知识点也是要掌握好的。

基本配置

创建uniapp项目

npx degit dcloudio/uni-preset-vue#vite-ts 项目名 :用于创建一个uniapp项目

npm run dev:mp-weixin :用于给项目打包成微信小程序的打包格式,接着直接将dist中相应的包导入到相应的微信开发者工具里面即可。

加上ts类型校验:npm i -D @types/wechat-miniprogram @uni-helper/uni-app-types

ts类型校验

接着在tsconfig.json配置文件中配置好这个类型校验:

{"extends": "@vue/tsconfig/tsconfig.json","compilerOptions": {"sourceMap": true,"baseUrl": ".","paths": {"@/*": ["./src/*"]},"lib": ["esnext", "dom"],"types": ["@dcloudio/types","@types/wechat-miniprogram",//加上"@uni-helper/uni-app-types"]//加上},"include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"]
}

uni-ui的支持

安装uni-helper/uni-ui-types:

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

再把@uni-helper/uni-ui-types加上以上的type配置项中去。

"types": ["@dcloudio/types","@types/wechat-miniprogram",//加上"@uni-helper/uni-app-types","@uni-helper/uni-ui-types"]//加上},

pinia配置

持久化配置:要先下载pinia持久化插件:

npm i pinia-plugin-persistedstate

插件默认使用 localStorage 实现持久化,小程序端不兼容,需要替换持久化 API。

store下的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'

 main.ts:

import { createSSRApp } from "vue";
import App from "./App.vue";
import pinia from './stores'
export function createApp() {const app = createSSRApp(App);app.use(pinia)return {app,};
}

要多端配置持久化,要在相应的store的ts文件中,配置持久化规则:

小程序端配置持久化persist,要专门配置下getItem和setItem:(在defineStore中配置此参数)

// TODO: 持久化persist: {storage:{getItem(key){return uni.getStorageSync(key)},setItem(key,value){uni.setStorageSync(key,value)}}}

 封装promise请求函数和请求过滤器

import { useMemberStore } from "@/stores/modules/member"
import { BaseRequestUrl } from "./properties"
const baseURL = BaseRequestUrl//添加拦截器
const httpInterceptor = {invoke(option:UniApp.RequestOptions){//非http开头的请求需要拼接地址if(!option.url.startsWith('http')){option.url = baseURL + option.url}//请求超时,默认是六十秒option.timeout = 30000console.log(option)//添加小程序请求头标识option.header = {...option.header, //如果有原来的请求头,保留原来的请求头后再加上小程序请求头'source-client':'miniapp'}//添加token请求头标识const memberStore = useMemberStore()const token = memberStore.profile?.tokenif(token){option.header.Authorization = token}}
}
uni.addInterceptor('request',httpInterceptor)
uni.addInterceptor('uploadFile',httpInterceptor)interface Data<T>{code:string,message:string,data:T
}export const sendRequest = <T>(option:UniApp.RequestOptions) => {  //指定泛型,该泛型是有效数据的类型return new Promise<Data<T>>((resolve,reject) => {  uni.request({...option,success(res){if(res.statusCode >= 200 && res.statusCode < 300){ //如果是2xx,说明是resolve(res.data as Data<T>)  //后端响应过来的有效数据}else if(res.statusCode === 401){// 401错误 -》 清理用户信息,跳转到登录页const memberStore = useMemberStore()memberStore.clearProfile()uni.navigateTo({url:'/pages/login/login'})reject(res)}else{//其他错误 -》 根据后端错误信息轻提示uni.showToast({icon:'none',title:(res.data as Data<T>).message || '请求错误'})}},fail(err){ //响应失败,一般是网络问题uni.showToast({icon:'none',title:'网络错误'})reject(err)}})})
}

 其实就是小程序端使用uni.request来发送请求,自定义了一个promise,内部使用了uni.request函数,用于发送请求。uni.request返回的数据中,是属于后端返回的数据的是res中的data,所以要返回的就是res.data。Data接口是后端返回的数据类型的格式。token的信息也封装在其中,登录后获取token之后,token信息会储存在pinia中,每次发送请求的时候,token会自动被读取到请求头中。

baseUrl是服务器的url地址或者微服务网关的url地址。

关于pages.json

在uniapp中,每个页面都是要注册在pages.json文件中。

在pages.json中,配置页面的路由地址及窗口表现、默认窗口表现、tarbar

代码案例:

{"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages{"path": "pages/index/index",//可以在此处修改一些小程序的页面信息"style": {"navigationBarTitleText": "首页"}},{"path" : "pages/my/my","style" : {"navigationBarTitleText" : "我的"}}],"globalStyle": {"navigationBarTextStyle": "black","navigationBarTitleText": "uni-app","navigationBarBackgroundColor": "#2ff8d0","backgroundColor": "#F8F8F8"},"tabBar": {"selectedColor": "#2ff8d0",//tarbar选中的时候的文字的颜色指定"list": [{"pagePath": "pages/index/index",//tabar的路由"text": "首页",//tabar下方的文字"iconPath": "static/tabs/home_default.png",//tabar的图标"selectedIconPath": "static/tabs/home_selected.png"//tabar被选中的时图标},{"pagePath": "pages/my/my","text": "我的","iconPath": "static/tabs/user_default.png","selectedIconPath": "static/tabs/user_selected.png"}]},
}

pages参数

pages参数是一个数组,数组中的元素就是一个一个的页面的信息,数组中的第一个元素代表的页面就是应用首页

path就是页面的路由地址,之后关于路由跳转页面的时候,都是使用这个配置的路由地址。

style是页面的一些窗口表现配置。style用于设置每个页面的状态栏、导航条、标题、窗口背景色等。在pages参数外还有一个参数叫globalStyle,用于配置全局窗口表现,每个页面的实际的窗口表现会先找style,如果没有的话再找globalStyle。

常见的样式如下:

属性类型默认值描述
navigationBarBackgroundColorHexColor#F8F8F8导航栏背景颜色(同状态栏背景色)
navigationBarTextStyleStringblack导航栏标题颜色及状态栏前景颜色,仅支持 black/white
navigationBarTitleTextString导航栏标题文字内容
navigationStyleStringdefault导航栏样式,仅支持 default/custom。custom即取消默认的原生导航栏
backgroundColorHexColor#ffffff窗口的背景色

至于具体的样式,见

pages.json 页面路由 | uni-app官网

tarbar

tarbar是用于配置一级导航栏,即底部的那个导航栏。

常用配置属性:

属性类型必填默认值描述
colorHexColortab 上的文字默认颜色
selectedColorHexColortab 上的文字选中时的颜色
backgroundColorHexColortab 的背景色
listArraytab 的列表,详见 list 属性说明,最少2个、最多5个 tab
positionStringbottom可选值 bottom、top,用于控制一级导航栏是显示在底部还是顶部

tarbar参数中的list数组,是一级导航栏里面的tab导航的信息的数组,tar导航的顺序和数组中的一致,tarbar最多配置五个tab,最少配置两个tab。

tab的配置属性:

属性类型必填说明
pagePathString页面路径,必须在 pages 中先定义
textStringtab 上按钮文字,在 App 和 H5 平台为非必填。例如中间可放一个没有文字的+号图标
iconPathString图片路径,icon 大小限制为40kb,建议尺寸为 81px * 81px,当 position 为 top 时,此参数无效,不支持网络图片,不支持字体图标
selectedIconPathString选中时的图片路径,icon 大小限制为40kb,建议尺寸为 81px * 81px ,当 position 为 top 时,此参数无效
visibleBoolean该项是否显示,默认显示
iconfontObject字体图标,优先级高于 iconPath

 具体参数信息见官网文档:pages.json 页面路由 | uni-app官网

分包

pages.json中还可以进行分包配置,分包可以让一些页面和主要的页面分开下载,即进入程序的时候,会默认下载主包中的页面信息,而分包中的信息,在进入指定页面的时候,此分包才会开始下载页面信息,如此可以大大优化小程序的下载和启动速度。

分包中的页面不要放在src下的pages目录中,要自定义一个和pages目录同级的新目录,代表一个分包,将分包页面放在此分包的目录中。

例:若有个分包叫pagesMember,此分包下有两个页面:settings.vue,profile.vue

{//组件自动导入的规则"easycom": {//是否开启自动扫描"autoscan": true,//以正则的方式自定义组件匹配规则"custom": {// uni-ui 规则如下配置"^uni-(.*)": "@dcloudio/uni-ui/lib/uni-$1/uni-$1.vue"}},"pages": [//pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages{"path": "pages/index/index","style": {"navigationStyle": "custom", //隐藏默认导航栏"navigationBarTitleText": "首页"}},{"path": "pages/my/my","style": {"navigationStyle": "custom","navigationBarTextStyle": "white","navigationBarTitleText": "我的"}}],"globalStyle": {"navigationBarTextStyle": "black","navigationBarTitleText": "","navigationBarBackgroundColor": "#F8F8F8","backgroundColor": "#F8F8F8"},// 设置 TabBar"tabBar": {"color": "#333","selectedColor": "#27ba9b","backgroundColor": "#fff","borderStyle": "white","list": [{"text": "首页","pagePath": "pages/index/index","iconPath": "static/tabs/home_default.png","selectedIconPath": "static/tabs/home_selected.png"}{"text": "我的","pagePath": "pages/my/my","iconPath": "static/tabs/user_default.png","selectedIconPath": "static/tabs/user_selected.png"}]},//分包信息配置"subPackages": [{"root": "pagesMember","pages": [{"path": "settings/settings","style": {"navigationBarTitleText": "设置"}},{"path": "profile/profile","style": {"navigationStyle": "custom","navigationBarTextStyle": "white","navigationBarTitleText": "个人信息详情页面"}}]}],//分包预下载规则"preloadRule": {"pages/my/my": {"network": "all", "packages": ["pagesMember"] }}
}

subPackages中,root是此分包中页面的的根目录,也就是以上自定义的那个pagesMember目录。

preloadRule就是指定,进入了哪个页面的时候,会下载哪个分包。参数名就是触发下载的页面的路径,参数值中的network是代表在什么网络环境下下载分包,packages是指定要加载哪些分包。

具体使用见:pages.json 页面路由 | uni-app官网

常用api

api比较多,我列举几个我觉得看了有用的api。例如上传文件、选择媒体资源上传到服务器、页面路由跳转、弹出窗口提示等。

uni.uploadFile()

此方法用于将文件数据上传到服务器中,请求方式是post,其中 content-type 为 multipart/form-data

参数名类型必填说明
urlString开发者服务器 url
fileTypeString见平台差异说明文件类型,image/video/audio
fileFile要上传的文件对象。
filePathString是(files和filePath选其一)要上传文件资源的路径。
nameString文件对应的 key , 开发者在服务器端通过这个 key 可以获取到文件二进制内容
headerObjectHTTP 请求 Header, header 中不能设置 Referer。
timeoutNumber超时时间,单位 ms
formDataObjectHTTP 请求中其他额外的 form data
successFunction接口调用成功的回调函数
failFunction接口调用失败的回调函数
completeFunction接口调用结束的回调函数(调用成功、失败都会执行)

        uni.uploadFile({url: 'https://www.example.com/upload', //仅为示例,非真实的接口地址filePath: tempFilePaths[0],name: 'file',formData: {'userInfo': userinfo.value},success: (uploadFileRes) => {console.log(uploadFileRes.data);}});

其中一定要注意的是,formData参数的参数值会变成一个json字符串请求给后端,后端可以在controller的方法的参数列表上,添加一个String的参数,在其前面的@RequestParam注解中,加上指定在formData中设置的key的名称,这个参数上就会接受到指定的formData中的相应的参数信息。

@PostMapping(value="/upload")public ResultData<RoleContentPo> voiceMsgSend(@RequestParam("userInfo") String str, @RequestParam("file") MultipartFile file){UserInfo userInfo = JSONObject.parseObject(str,UserInfo.class);//其他操作
}

关于下载文件,没什么要特殊说明的,见文档:uni.uploadFile(OBJECT) | uni-app官网

uni.chooseMedia()

用于用户从自己的相册中选择图片或者启动拍照功能获取图片。

参数名类型默认值必填说明
countNumber9(注意:ios不可大于9)最多可以选择的文件个数
mediaTypeArray.<string>['image', 'video']文件类型
sourceTypeArray.<string>['album', 'camera']图片和视频选择的来源
maxDurationNumber10拍摄视频最长拍摄时间,单位秒。时间范围为 3s 至 30s 之间
sizeTypeArray.<string>['original', 'compressed']仅对 mediaType 为 image 时有效,是否压缩所选文件
cameraString'back'仅在 sourceType 为 camera 时生效,使用前置或后置摄像头
successfunction接口调用成功的回调函数
failfunction接口调用失败的回调函数
completefunction接口调用结束的回调函数(调用成功、失败都会执行)

 代码案例:

uni.chooseMedia({count: 9,mediaType: ['image','video'],sourceType: ['album', 'camera'],maxDuration: 30,camera: 'back',success(res) {console.log(res.tempFiles)}
})

res.tempFiles是选择的图片/视频的临时文件的路径的数组,其中的元素就是一个个临时文件的路径。

路由跳转

uni.navigateTo()

保留原有页面,跳转到指定的页面。要跳转到原来的页面,使用uni.navigateBack()即可跳回原来的页面。

参数类型必填说明
urlString需要跳转的应用内非 tabBar 的页面的路径 , 路径后可以带参数。参数与路径之间使用?分隔,参数键与参数值用=相连,不同参数用&分隔;如 'path?key=value&key2=value2',path为下一个页面的路径,下一个页面的onLoad函数可得到传递的参数
successFunction接口调用成功的回调函数
failFunction接口调用失败的回调函数
completeFunction接口调用结束的回调函数(调用成功、失败都会执行)

uni.navigateTo({url: '/pages/login/login?id=1&name=uniapp'
});

路由路径后面带的参数可以被下个页面的onLoad函数的参数中获取,当然也会作为query参数传递。

uni.redirectTo()

和uni.navigate使用方法一致,区别是,uni.redirectTo()是关闭当前页面,跳转到指定页面,类似一个替换的效果。

uni.reLaunch()

使用也是和以上两个一致,区别是,它使用后,会关闭此前的所有的页面,跳转到指定页面

uni.switchTab()

以上的四个api都是只能用于打开非tab页面,要想打开tab页面,要使用uni.switchTab,使用方法和以上四个是一致的。只是页面路径要是tab页面。并且使用了该方法后会关闭所有的非tab页面。

uni.navigateBack()

用于回退到之前的页面。

参数类型必填默认值说明
deltaNumber1返回的页面数,如果 delta 大于现有页面数,则返回到首页。
successFunction接口调用成功的回调函数
failFunction接口调用失败的回调函数
completeFunction接口调用结束的回调函数(调用成功、失败都会执行)

 当然,更多的知识点和使用方法,在官网文档中才是最详细的,uniapp官网:uni-app官网

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

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

相关文章

Windows Server 怎么关闭IE增强安全配置(关闭IE弹窗)

首先第一步打开IE浏览器&#xff0c;根据下图所示&#xff0c;访问网页时会弹出警告窗口。 打开【控制面板】图标。查看方式改为小图标&#xff0c;打开【管理工具】 第五步进入【管理工具】页面后&#xff0c;找到并双击【服务器管理器】选项。 第六步在弹出的窗口中&#…

鸿萌数据迁移服务: 企业服务器整机在线热迁移, 实现不停机业务转移

天津鸿萌科贸发展有限公司从事数据安全服务二十余年&#xff0c;致力于为各领域客户提供专业的数据存储、数据恢复、数据备份、数据迁移等解决方案与服务&#xff0c;并针对企业面临的数据安全风险&#xff0c;提供专业的相关数据安全培训。 鸿萌数据迁移业务为众多企业顺利高效…

vue2组件封装和UI组件的二次封装,方法,属性,ref的传递

封装组件使用v-model 使用方法props接受value值&#xff0c;当值发生变化的时候再通过this.$emit("input", newValue)&#xff0c;则实现了简单组件的v-model封装,如果不使用第三方UI可以接受到的值使用watch或者计算属性保存&#xff0c;然后再通过事件派发自己保存…

无网络安装ionic和运行

npm 安装本地文件 之前使用npm安装包都是在有网络环境下&#xff0c;因为需要部署无互联网环境开发&#xff0c;才知道如何使用npm安装包安装本地文件/文件夹 >npm install <folder>如果 <folder> 位于项目的根目录中&#xff0c;它的依赖项将被安装&#xff…

ChatGPT 新体验:AI 搜索功能与订阅支付指南

就在凌晨&#xff0c;在 ChatGPT 迎来两周岁生日之际&#xff0c;OpenAI 重磅发布了 ChatGPT 的全新人工智能搜索体验。 期待已久的时刻终于到来&#xff0c; ChatGPT 正式转型成为一款革命性的 AI 搜索引擎&#xff01; 先来看看 ChatGPT 搜索&#xff1a;这次不是简单的加个…

测试开发面试题记录

1. TCP与UDP的区别及应用场景 TCP (传输控制协议)&#xff1a; 特点&#xff1a;面向连接&#xff0c;可靠性高&#xff0c;数据顺序保证&#xff0c;流量控制和拥塞控制。应用场景&#xff1a;文件传输&#xff08;FTP&#xff09;&#xff0c;电子邮件&#xff08;SMTP&#…

[JAVAEE] 面试题(四) - 多线程下使用ArrayList涉及到的线程安全问题及解决

目录 一. 多线程下使用ArrayList 1.1. 自行判断加锁 1.2 使用Collections.synchronizedList()套壳加锁 1.3 CopyOnWriteArrayList类 二. 总结 一. 多线程下使用ArrayList 多线程下使用ArrayList会涉及到线程安全问题, 例如: public static void main(String[] args) thro…

canal1.1.7使用canal-adapter进行mysql同步数据

重要的事情说前面&#xff0c;canal1.1.8需要jdk11以上&#xff0c;大家自行选择&#xff0c;我这由于项目原因只能使用1.1.7兼容版的 文章参考地址&#xff1a; canal 使用详解_canal使用-CSDN博客 使用canal.deployer-1.1.7和canal.adapter-1.1.7实现mysql数据同步_mysql更…

DevExpress中文教程 - 如何使用AI模型检查HTML编辑中的语法?

DevExpress .NET MAUI多平台应用UI组件库提供了用于Android和iOS移动开发的高性能UI组件&#xff0c;该组件库包括数据网格、图表、调度程序、数据编辑器、CollectionView和选项卡组件等。 目前许多开发人员正在寻找多种方法将AI添加到解决方案中&#xff08;这通常比想象的要…

【推荐】iptables学习宝典

链接&#xff1a; IPtables-朱双印博客 学习iptables的抗鼎之作&#xff0c;推荐。

sudo docker ps才能查看,docker ps不能查看问题

出现 permission denied while trying to connect to the Docker daemon socket 的错误&#xff0c;通常是因为当前用户没有权限访问 Docker 的 Unix 套接字 /var/run/docker.sock。在 Linux 系统中&#xff0c;这个套接字默认只能由 root 用户或 docker 组的成员访问。 要解决…

二维数组和数组指针数组的关系

在深入理解指针end中&#xff0c;我在最后写了一长段代码 #include<stdio.h> void test1(int arr[][5], int x, int y) //void test1(int(*p)[5], int x, int y) {for (int i 0; i < x; i){for (int j 0; j < y; j){//printf("%d ", *(*(p i) j));p…

vue+websocket实现即时聊天平台

目录 1 什么是websocket 2 实现步骤 2.1 导入依赖 2.2 编写代码 1 什么是websocket WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它主要用于在客户端和服务器之间建立持久的连接&#xff0c;允许实时数据交换。WebSocket 的设计目的是为了提高 Web 应用程序的…

# RabbitMQ学习

RabbitMQ 1、RabbitMQ是什么&#xff1f; RabbitMQ 是一个开源的消息中间件系统&#xff0c;主要用于在分布式系统中存储、转发和接收消息。它实现了 AMQP&#xff08;高级消息队列协议&#xff09;标准&#xff0c;能够帮助构建可靠且高效的分布式应用程序 2、RabbitMQ能做…

Docker Compose V2 安装

要安装 docker-compose-plugin&#xff0c;需要确保系统已安装 Docker 引擎&#xff0c;因为 docker-compose-plugin 是 Docker CLI 的插件&#xff08;Docker Compose V2&#xff09;。以下是详细指南&#xff1a; 1. 安装 Docker 引擎&#xff1a; 确保系统上安装了 Docker…

【D3.js in Action 3 精译_038】4.2 D3 折线图的绘制方法及曲线插值处理

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一部分 D3.js 基础知识 第一章 D3.js 简介&#xff08;已完结&#xff09; 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践&#xff08;上&#xff09;1.3 数据可…

Git 的分支管理

一、分支介绍 1、分支是什么 Git作为一个分布式版本控制系统&#xff0c;提供了强大而灵活的分支管理功能&#xff0c;使得开发团队能够高效地协作开发、管理不同的功能和版本。 2、为什么有分支 一般情况下主分支&#xff08;master/main&#xff09;应始终保持可部署的状…

Linux环境基础和基础开发工具使用

文章目录 一、yum软件管理器1、包管理器2、yum3、apt4、安装源 二、编辑器vim1、各种模式2、打开时直接让光标定位到指定号3、&#xff01;加命令字符 三、命令模式1、i 进入插入模式2、**Shift :** 进入底行模式3、光标定位4、ZZ&#xff08;大写&#xff09;保存并退出vim5、…

2024 信友队 noip 冲刺 10.10

T1 前缀和 二分即可&#xff0c;再考虑一下左右端点还在睡觉的情况。 // Problem: D - Sleep Log // Contest: AtCoder - KYOCERA Programming Contest 2023&#xff08;AtCoder Beginner Contest 305&#xff09; // URL: https://atcoder.jp/contests/abc305/tasks/abc305…

【java】哈希<两数之和> 理解哈希

两数之和 题目描述&#xff1a; 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案&#xff0c;并且你不能使用两次相同的元素。 你…