uniapp的通用页面及组件基本封装

1.基本布局页面

适用于自定义Navbar头部

<template><view :style="{ background : param.bgColor , height: '100%' }"><block v-if="param.noHead"><slot name="head"></slot></block><block v-if="!param.noHead"><view class="bar" :style="{height : systemInfo.statusBarHeight + 'px', background: param.barBgColor }"></view><view class="headBox" :style="{ height: param.headHight + 'px',background: param.headBgColor,}"><view class="leftBox"><slot name="left"><view class="back" v-if="autoBack" @click="uni.navigateBack({ delta: 1 })"><XIcon name="back" blod></XIcon></view></slot></view><view class="centerBox"><slot name="center"><view class="title">{{param.title}}</view></slot></view><view class="rightBox" :style="{ paddingRight: !slots.right ? 0 + 'px' : (menuButton.width + 12) + 'px' }"><slot name="right"></slot></view></view></block><slot name="nav"></slot><scroll-view @scrolltolower="emits('tolower',true)" scroll-y id="calcBasePoint" :style="`height:${ rollHight }px;overflow-y: auto;`"><slot name="container"></slot></scroll-view></view>
</template><!-- 适用于自定义Navbar头部 -->
<script setup lang="ts">import { onMounted , ref , useSlots } from "vue";import { getPageResidueDIST } from "@/utils/common";import XIcon from "@/element/XIcon.vue"const param = withDefaults(defineProps<{barBgColor: string;headHight: number;headBgColor: string;autoBack: boolean;title: string;noHead: boolean;bgColor: string;}>(),{bgColor: '#FAFAFA',headHight: 44,headBgColor: '#ffffff',barBgColor: '#ffffff',autoBack: true,title: '',noHead: false})const emits = defineEmits<{( e: 'tolower' , status : boolean ) : void,(e : 'sysInfo', data : any ) : void}>();const slots = useSlots();const systemInfo = ref<any>({});const menuButton = ref<any>({ width: 0 });const init = async () => {systemInfo.value = await uni.getSystemInfo();// #ifndef APP || H5menuButton.value = uni.getMenuButtonBoundingClientRect();// #endifemits('sysInfo',{system: systemInfo.value,menuBtn: menuButton.value});};onMounted(() => {init();setRollHight();});let rollHight = ref<number>(0);async function setRollHight() {let calcPoint = await getPageResidueDIST('#calcBasePoint');console.log(systemInfo.value?.safeAreaInsets?.bottom);rollHight.value = calcPoint - (!systemInfo.value?.safeAreaInsets?.bottom ?  0 : systemInfo.value?.safeAreaInsets?.bottom) ;// #ifdef APP || MP-WEIXINrollHight.value = rollHight.value - systemInfo.value.statusBarHeight - param.headHight;// #endif}</script><style scoped lang="scss">.headBox {display: flex;align-items: center;justify-content: space-between;padding: 0 12px;width: 100%;box-sizing: border-box;.leftBox {flex: 1;display: flex;justify-content: flex-start;}.centerBox {flex: 2;display: flex;justify-content: center;text-align: center;.title {font-size: 16px;color: #303133;}}.rightBox {flex: 1;display: flex;justify-content: flex-end;}}</style>

2.阿里iocn

注意使用阿里icon需要下载阿里的字体图标,然后把css的文件引入到app.vue,就可以使用iconfont icon-xxx,是你图标名称

<template><view><text :class='`iconfont icon-${param.name}`' :style="{ fontSize: param.size + 'rpx' , color: param.color , fontWeight : param.blod ? '400' : 'bloder' }" ></text></view>
</template><script lang="ts" setup>import { onBeforeMount, ref } from "vue";interface Prop {name: string;size?: number;color? : string;blod?: false;}const param = withDefaults(defineProps<Prop>(),{size: 38});</script><style lang="scss" scoped>
</style>

3.缓存工具

这里扩展了一个记录历史查看

export function setCache(key : string, value : any ) {uni.setStorageSync(key,value);
}export function getCache(key : string) : any | null {return uni.getStorageSync(key);
}export function removeCache(key : string)  {return uni.removeStorageSync(key);
}interface Record {time: number;key: any;
}export function saveHistory(key : string,val : any) {let localHistory : Array<Record> = getCache(key);if(!localHistory) { localHistory = [] }if(localHistory.some(item => item.key == val)) { return }localHistory.unshift({time: new Date().getTime(),key: val});setCache(key,localHistory);
}export function removeHistory(key : string,val : any) : number {let row : number = 0;let localHistory : Array<Record> = getCache(key);if(!localHistory) { localHistory = [] }row = localHistory.length;localHistory = localHistory.filter(item => {if (item.key === val) {row++;return false;}return true;});setCache(key,localHistory);return row - localHistory.length;
}

4.公共工具类

获取位置、计算元素剩余搞定 , 页面跳转

import { getCurrentInstance } from "vue";/*** 根据类型跳转页面并传递数据* * @param type - 跳转类型:*               - 0: 使用 `uni.navigateTo` 跳转,保留当前页面,跳转到新页面*               - 1: 使用 `uni.switchTab` 跳转,切换到指定 tabBar 页面* @param url - 目标页面的路径* @param key ? - 事件通道中传递数据的键名* @param data ? - 通过事件通道传递的数据*/
export function skipPage(type : number,url : string,key ? : string , data ? : any) {switch (type){case 0:uni.navigateTo({url,success(res) {res.eventChannel.emit(key,data);}	})break;case 1:uni.switchTab({url,success(res) {res.eventChannel.emit(key,data);}	})break;default:console.log('接入中!');break;}
}export async function getPageResidueDIST(nodeKey: string) : Promise<number> {const query = uni.createSelectorQuery().in(getCurrentInstance());let systemInfo = await uni.getSystemInfo();let nodeToTop : number = await new Promise((ok, _) => {query.select(nodeKey).boundingClientRect((data: any) => {ok(data.top);}).exec();});return systemInfo.windowHeight - nodeToTop;
}export async function getSystemInfo() {return await uni.getSystemInfo();
}export async function getMenuButton() {// #ifndef APP || H5return uni.getMenuButtonBoundingClientRect();// #endifreturn { width: 0  }
}export async function getElementHight(nodeKey: string) : Promise<number> {const query = uni.createSelectorQuery().in(getCurrentInstance());let nodeToTop : number = await new Promise((ok, _) => {query.select(nodeKey).boundingClientRect((data: any) => {ok(data.height);}).exec();});return nodeToTop;
}interface Point {latitude: number;longitude: number;
}export async function initLocation() : Promise<any> {return await uni.getLocation({type: 'wgs84',geocode:true});
}export async function getAddress() : Promise<any> {return new Promise(( ok ) =>{uni.chooseLocation({success: function (res) {ok({code: 200,address: res.address,latitude: res.latitude,longitude: res.longitude,name: res.name})},fail() {ok({code: 201})}	});})
}

5.网络请求类

import { env } from "@/env"export default function() {interface AskModel {url: string,data?: anymethod?: 'OPTIONS' | 'GET' | 'HEAD' | 'POST' | 'PUT' | 'DELETE' | 'TRACE' | 'CONNECT'}interface ApiRes<T> {code: number;msg: string;data: T;}async function orderMealAsk<T>( option : AskModel ) : Promise<ApiRes<T>> {return new Promise(( resolve, reject ) => {uni.request({url:  env.orderMealReq + option.url, data: option.data || {},method: option.method || 'GET',header: {'content-type':'application/json' },success: (res) => {resolve(res.data as ApiRes<T>);},fail(res) {reject(res);}});})}return {  orderMealAsk }
}

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

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

相关文章

基于MTF的1D-2D-CNN-GRU-Attention时序图像多模态融合的故障识别,适合研究学习(Matlab完整源码和数据),附模型研究报告

基于MTF的1D-2D-CNN-GRU-Attention时序图像多模态融合的故障识别&#xff0c;适合研究学习&#xff08;Matlab完整源码和数据&#xff09;&#xff0c;附模型研究报告 目录 基于MTF的1D-2D-CNN-GRU-Attention时序图像多模态融合的故障识别&#xff0c;适合研究学习&#xff08;…

HTTP/1.1 队头堵塞问题

文章目录 一、队头堵塞1、非管线化2、管线化 二、如何解决&#xff1f; 一、队头堵塞 1、非管线化 如图&#xff0c;http 请求必须等到上一个请求响应后才能发送&#xff0c;后面的以此类推&#xff0c;由此可以看出&#xff0c;在一个 tcp 通道中&#xff0c;如果某个 http 请…

施磊老师基于muduo网络库的集群聊天服务器(二)

文章目录 Cmake简单介绍Cmake与MakefileCmake配置CmakeLists.txt 编写完整cmake例子文件夹杂乱问题多级目录Cmakevscode 极其推荐 的 cmake方式 Mysql环境与编程mysql简单使用User表Friend表AllGroup表GroupUser表OfflineMessage表 集群聊天项目工程目录创建网络模块代码Chatse…

4.18---缓存相关问题(操作原子性,击穿,穿透,雪崩,redis优势)

为什么要用redis做一层缓存&#xff0c;相比直接查mysql有什么优势&#xff1f; 首先介绍Mysql自带缓存机制的问题&#xff1a; MySQL 的缓存机制存在一些限制和问题,它自身带的缓存功能Query Cache只能缓存完全相同的查询语句&#xff0c;对于稍有不同的查询语句&#xff0c…

健康养生指南

在快节奏的现代生活中&#xff0c;健康养生成为人们关注的焦点。它不仅关乎身体的强健&#xff0c;更是提升生活质量、预防疾病的关键。掌握科学的养生方法&#xff0c;能让我们在岁月流转中始终保持活力。 饮食是健康养生的基础。遵循 “均衡膳食” 原则&#xff0c;每日饮食需…

#去除知乎中“盐选”付费故事

添加油猴脚本&#xff0c;去除知乎中“盐选”付费故事 // UserScript // name 盐选内容隐藏脚本 // namespace http://tampermonkey.net/ // version 0.2 // description 自动隐藏含有“盐选专栏”或“盐选”文字的回答卡片 // author YourName // mat…

如何防止接口被刷

目录 &#x1f6e1;️ 一、常见的防刷策略分类 &#x1f527; 二、技术实现细节 ✅ 1. 基于 IP 限流 ✅ 2. 给接口加验证码 ✅ 3. 使用 Token 限制接口访问权限 ✅ 4. 给接口加冷却时间&#xff08;验证码类经典&#xff09; ✅ 5. 使用滑动窗口限流算法&#xff08;更精…

github 项目迁移到 gitee

1. 查看远程仓库地址 git remote -v 2. 修改远程仓库地址 确保 origin 指向你的 Gitee 仓库&#xff0c;如果不是&#xff0c;修改远程地址。 git remote set-url origin https://gitee.com/***/project.git 3. 查看本地分支 git branch 4. 推送所有本地分支 git p…

探索大语言模型(LLM):目标、原理、挑战与解决方案

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言语言模型的目标语言模型的数学表示语言模型面临的挑战解决参数量巨大的方法1. 马尔可夫假设2. 神经网络语言模型3.自监督学习4. 分布式表示 脑图总结 前言 在自…

Kubernetes》》k8s》》Namespace

Namespace 概述 Namespace&#xff08;命名空间&#xff09; 是 Kubernetes 中用于逻辑隔离集群资源的机制&#xff0c;可将同一集群划分为多个虚拟环境&#xff0c;适用于多团队、多项目或多环境&#xff08;如开发、测试、生产&#xff09;的场景。 核心作用&#xff1a; 资…

FFUF指南

ffuf 的核心功能&#xff1a; 目录/文件发现&#xff1a; 通过暴力破解&#xff08;使用字典&#xff09;探测目标网站的隐藏目录或文件&#xff0c;例如&#xff1a; ffuf -w /path/to/wordlist.txt -u http://target.com/FUZZ 子域名枚举&#xff1a; 通过模糊测试发现目标…

Qt通过ODBC和QPSQL两种方式连接PostgreSQL或PolarDB PostgreSQL版

一、概述 以下主要在Windows下验证连接PolarDB PostgreSQL版&#xff08;阿里云兼容 PostgreSQL的PolarDB版本&#xff09;。Linux下类似&#xff0c;ODBC方式则需要配置odbcinst.ini和odbc.ini。 二、代码 以下为完整代码&#xff0c;包含两种方式连接数据库&#xff0c;并…

为什么浮点数会搞出Infinity和NAN两种类型?浮点数的底层原理?IEEE 754标准揭秘?

目录 什么是NAN? 不同编程语言的NaN 为什么浮点数会搞出Infinity和NAN两种类型? 浮点数 小数点位置浮动的原因 浮点数和整数 浮点数指令 精确性 浮点数的类型 为什么叫浮点数? 小数点位置浮动的原因 IEEE 754起源于intel公司 IEEE 754标准 编程语言的浮点数都…

Node.js Session 原理简单介绍 + 示例代码

目录 ✅ Session 原理简要说明 &#x1f9e9; 示例项目 - 使用 Node.js Express 实现简单 Session 登录 &#x1f4c1; 文件结构 &#x1f539; server.js (JavaScript) &#x1f538; index.html (HTML) ▶️ 程序运行步骤 ✅ 程序运行效果 &#x1f3af; 总结 在 We…

实战交易策略 篇十六:猎豹阿杜打板交易策略

文章目录 系列文章狙击涨停板的十大要诀炒股大成者,必具“三商”系列文章 实战交易策略 篇一:奥利弗瓦莱士短线交易策略 实战交易策略 篇二:杰西利弗莫尔股票大作手操盘术策略 实战交易策略 篇三:333交易策略 实战交易策略 篇四:价值投资交易策略 实战交易策略 篇五:底部…

Opentelemetry 项目解读

Opentelemetry 解读 1. 什么是 Opentelmetry Ot 统一了可观测的三个重要维度&#xff1a;分别是 Trace&#xff0c;Log&#xff0c;Metrics。 在没有 ot 之前&#xff0c;不同维度的可观测组件都是不同的&#xff1a; 在 Trace 领域&#xff1a;skywalking 一直很受欢迎&am…

与终端同居日记:Linux指令の进阶撩拨手册

前情提要&#xff1a; 当你和终端的关系从「早安打卡」进阶到「深夜代码同居」&#xff0c;那些曾经高冷的指令开始展露致命の反差萌—— man 是那个永远在线的钢铁直男说明书&#xff0c;只会说&#xff1a;"想懂我&#xff1f;自己看文档&#xff01;"&#xff08…

Java 开发玩转 MCP:从 Claude 自动化到 Spring AI Alibaba 生态整合

摘要 本文以原理与示例结合的形式讲解 Java 开发者如何基于 Spring AI Alibaba 框架玩转 MCP&#xff0c;主要包含以下内容。 1. 一些 MCP 基础与快速体验&#xff08;熟悉的读者可以跳过此部分&#xff09; 2. 如何将自己开发的 Spring 应用发布为 MCP Server&#xff0c;验…

【面试向】欠拟合和过拟合、正则化(Regularization)

训练集、验证集和测试集泛化误差过拟合&#xff08;Overfitting&#xff09;和 欠拟合&#xff08;Underfitting&#xff09;如何区分过拟合和欠拟合&#xff1f;欠拟合 —— 在训练集和验证集上都表现很差过拟合 —— 在训练集上表现很好&#xff0c;但在验证集或测试集上表现…

ClawCloud的免费空间(github用户登录可以获得$5元/月的免费额度)

免费的空间 Welcome to ClawCloud Lets create your workspace 官网&#xff1a;ClawCloud | Cloud Infrastructure And Platform for Developers 区域选择新加坡 然后这个页面会变成新加坡区域&#xff0c;再按一次确定&#xff0c;就创建好了工作台。 初始界面&#xff0…