【vue3+Typescript】手撸了一个轻量uniapp导航条

devtools/2024/9/20 7:18:44/ 标签: uni-app, vue, tailwindcss, typescript

最近公共组件写到导航条,本来打算拿已有的改。看了下uniapp市场上已有的组件,一是不支持vue3+typescript,二是包装过重。索性自己手撸了一个导航条,不到100行代码全部搞定,因为自己的需求很简单:

1)遵循28原则,能覆盖80%以上导航需求即可,特殊需要单独写代码

2)适配状态条和小程序胶囊区高度

3)默认浮动定位(滚动贴顶),可以指定样式修改为非浮动。这个不用添加额外代码,直接在组件使用时指定css即可

4)支持大/中/小标题

5)支持中间和右边占位组件,中间可以放个搜索框什么。右边可以放

6)支持背景图片,这个不用额外添加代码,直接在使用时指定css即可,默认背景透明,背景渐变色也是通过css自己去指定

7)支持更改左侧的导航图片,有时候要深色样式,就要换个返回按钮svg图片了

8)支持返回多步或跳转首页。具体场景在代码里有注释

组件全部代码(unibest框架下,否则可能要自己导入vue一些公共方法):

<template><view class="fixed left-0 right-0 top-0"><view :style="{ height: statusBarHeight + 'px' }" /><view class="x-items-center" :style="{ height: navbarHeight }"><view class="flex-center w-80rpx" @click="doBack"><image :src="props.backImgUrl" class="w-40rpx h-40rpx" /></view><slot><view class="flex-1 text-center" :style="_titleStyle">{{ props.title }}</view></slot><slot name="right"><div class="w-80rpx"></div></slot></view></view>
</template>
<script lang="ts" setup>
import type { CSSProperties } from 'vue'type CustomCSSProperties = CSSProperties & {fontSize?: string // 允许使用 rpx 等自定义单位
}// 获取状态栏高度
const { statusBarHeight } = uni.getSystemInfoSync()const props = withDefaults(defineProps<{title?: string // 指定标题内容titleStyle?: CustomCSSProperties // 指定标题样式titleSize?: 'small' | 'medium' | 'large' // 指定标题文本大小titleColor?: string // 指定标题颜色backImgUrl?: string // 指定返回按钮图片backMode: 'back' | 'home' | number // 指定返回按钮的回退模式/*** 回退模式backMode:* back: 默认回退,一般用于返回上一页* home: 跳转到首页(/pages/index/index且不可返回),一般用于例如支付完成的跳转* number: 回跳指定数量页面,一般用于多步流程跳转到流程第一页*/}>(),{title: '标题',titleStyle: () => ({fontSize: '32rpx', // 自定义单位fontWeight: 500}),titleSize: 'medium',titleColor: '#333333',backImgUrl: '/static/images/back-b.svg',backMode: 'back'}
)const _titleStyle = computed(() => {return {...props.titleStyle,fontSize:props.titleSize === 'small' ? '32rpx' : props.titleSize === 'large' ? '48rpx' : '40rpx',color: props.titleColor}
})const navbarHeight = computed(() => {// 只处理安卓/IOS/微信小程序if (process.env.VUE_APP_PLATFORM === 'mp-weixin') {const menuButtonInfo = uni.getMenuButtonBoundingClientRect()return menuButtonInfo.height + (menuButtonInfo.top - statusBarHeight) * 2 + 2 + 'px'} else {return '80rpx'}
})const doBack = () => {if (props.backMode === 'home') {uni.reLaunch({url: '/pages/index/index'})} else if (props.backMode === 'back') {uni.navigateBack()} else {uni.navigateBack({delta: props.backMode})}
}
</script>

标准用法效果:

<cc-navbar class="relative bg-amber" title="选择功能" />

效果:

添加中间和右边组件:

    <cc-navbar class="bg-amber"><view class="flex-1"><up-button>点我点我</up-button></view><template #right><text>右边的东西</text></template></cc-navbar>

效果:

默认的back-b.svg文件:

<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1722612224491" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="8436" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M789.048889 886.613333l-80.213333 80.213334L254.520889 512.512 255.032889 512l-0.512-0.483556L708.835556 57.173333l80.213333 80.213334L414.435556 512l374.613333 374.613333z" fill="#515151" p-id="8437"></path></svg>

还有个深色主题的back-w.svg,修改下上面的fill颜色值即可

x-items-center和flex-center是自己的tailwindcss快速组合样式:

.x-items-center {

  // 水平排列,垂直居中

  @apply flex flex-row items-center;

}

.flex-center {

  // 完全居中,使用flex定位

  @apply flex justify-center items-center;

}


http://www.ppmy.cn/devtools/97238.html

相关文章

详解Element-UI el-table表格中勾选checkbox(selection)多选删除

本节讲解的是关于组件库中el-table组件多选删除功能的实现。 1.Vue文件内的引用 2.页面数据 3.存储多选数据 4. 处理多选数据 这里通过循环的方式找到数据并对数据删除&#xff0c;这种方式易于理解&#xff0c;但不一定是最优方案

深入Swift内核:编译器诊断信息的奥秘与实践

标题&#xff1a;深入Swift内核&#xff1a;编译器诊断信息的奥秘与实践 在Swift语言的编程世界中&#xff0c;编译器的诊断信息是开发者与编译器沟通的桥梁。它不仅帮助开发者快速定位问题&#xff0c;还提供了解决问题的线索。本文将深入探讨Swift编译器的诊断信息工作原理&…

k8s 进阶实战笔记 | Ingress-traefik(一)

文章目录 traefik认知基本概述基础特性其他ingress对比核心概念和能力 安装部署创建CRD资源RBAC资源创建配置文件部署traefik预期效果 traefik认知 基本概述 ● 官网&#xff1a;https://traefik.cn ● 现代HTTP反向代理、负载均衡工具 ● 它支持多种后台 (Docker, Swarm, Ku…

ImageMagick从pdf导出高清图片

-density 指定dpi -quality 指定压缩率 参考:https://blog.csdn.net/qq_38883889/article/details/121764516 命令行: magick -density 300 -quality 10 1.pdf 1.jpg

【springboot】自定义starter

自定义一个starter&#xff0c;实现获取系统和程序信息。 0. 项目结构 org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件是用来加载自动配置类的&#xff0c;该文件必须放在META-INF/spring/目录下。 1. 创建项目 创建一个普通的maven项目&#xff0c;使…

深入理解LDA主题模型及其在文本分析中的应用

深入理解LDA主题模型及其在文本分析中的应用 在自然语言处理领域,主题模型是一种强大的工具,能够自动发现文档集中的潜在主题。在大规模文本数据分析中,Latent Dirichlet Allocation (LDA) 是最受欢迎的主题模型之一。LDA的核心目标是从文档集中提取不同的主题,并确定每篇…

C语言 ——— 学习并使用calloc和realloc函数

目录 calloc函数的功能 学习并使用calloc函数​编辑 realloc函数的功能 学习并使用realloc函数​编辑 calloc函数的功能 calloc函数的功能和malloc函数的功能类似&#xff0c;于malloc函数的区别只在于calloc函数会再返回地址之前把申请的空间的每个字节初始化为全0 C语言…

STM32 HAL库常用功能封装

关中断 /*** brief 关闭所有中断(但是不包括fault和NMI中断)* param 无* retval 无*/ void sys_intx_disable(void) {__ASM volatile("cpsid i"); }开中断 /*** brief 开启所有中断* param 无* retval 无*/ void sys_intx_enabl…

【MATLAB机器人系统工具箱】【manipulatorRRT规划器】属性和方法解析

启用了连接启发式&#xff08;heuristic&#xff09;后&#xff0c;双向快速扩展随机树&#xff08;RRT&#xff09;算法会在以下情况下忽略 MAXCONNECTIONDISTANCE 的限制&#xff1a;当两棵树&#xff08;起始树和目标树&#xff09;之间的节点距离足够接近时&#xff0c;算法…

计算机Java项目|基于SpringBoot的大学生一体化服务平台的设计与实现

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参…

【1】开源!移植OpenHarmony轻量系统到雅特力AT32F437ZMT MCU

笔者最近将OpenHarmony轻量系统移植到AT32F437 MCU&#xff0c;移植架构采用Board与SoC分离方案&#xff0c;使用arm gcc工具链Newlib C库&#xff0c;并且提供了相应的样例应用代码&#xff08;样例代码持续更新中&#xff09; 移植 基于雅特力科技官方开发板 AT-START-F437 …

flume系列之:定位flume没有关闭某个时间点生成的tmp文件的原因,并制定解决方案

flume系列之:定位flume没有关闭某个时间点生成的tmp文件的原因,并制定解决方案 一、背景二、分析tmp文件三、定位原因四、解决方法一、背景 flume没有关闭生成的tmp文件临时解决方案是批量关闭tmp文件下一步深入定位分析原因二、分析tmp文件 观察tmp文件,发现tmp文件的时间点…

Linux Bridge VLAN

一、Linux Bridge VLAN &#xff08;1&#xff09;是什么&#xff1f; Bridge 是什么 VLAN 是什么 LINUX BRIDGE VLAN又是什么&#xff1f;——> &#xff08;2&#xff09;解决什么问题&#xff1f;【应用场景】 应用背景 已一个实际问题引出 【应用场景】&#xff1a; 【…

武汉流星汇聚:西班牙时尚消费高涨,中国商家借亚马逊平台拓商机

在2024年第二季度的亚马逊西班牙站&#xff0c;一场前所未有的时尚盛宴正悄然上演。销售额同比高增长TOP10品类榜单的揭晓&#xff0c;不仅揭示了西班牙消费者对于时尚品类的狂热追求&#xff0c;更为亚马逊平台上的中国商家开启了一扇通往新蓝海的大门。其中&#xff0c;男士拳…

SSH协议与OpenSSH配置详解(配置密钥对验证实验)

文章目录 SSH 协议与 OpenSSH 配置详解1. SSH 协议概述2. OpenSSH 概述3. 配置SSH&#xff08;sshd_config文件&#xff09;3.1 配置服务监听选项3.2 配置用户登录控制&#xff08;黑白名单&#xff09;3.3 配置登录验证方式&#xff08;密钥对验证&#xff09;3.4 常用的配置项…

PHP中如何限制PDF文件大小的简单示例

例如&#xff0c;如果我们希望限制PDF文件的大小不超过5MB&#xff0c;我们可以将这两个配置项都设置为5M。 upload_max_filesize 5M post_max_size 5M接下来&#xff0c;在PHP脚本中&#xff0c;我们可以通过检查$_FILES全局数组来获取上传文件的大小&#xff0c;并作出相应…

【5.0】vue请求函数和路由

【5.0】vue请求函数和路由 此处是与后端交互发送请求拿到数据&#xff0c;和vue自己中的页面跳转路由 【一】axios使用 【1】安装 终端命令 npm install axios -S【2】基本语法 axios.get(后端地址&#xff08;django&#xff09;).then(res > {console.log(res.data.res…

ArrayList详解

简介 【概述】 List的主要实现类&#xff0c;底层使用Object[]存储&#xff0c;适用于频繁的查找工作&#xff0c;线程不安全。 【特点】 增删慢&#xff1a;每次删除元素&#xff0c;都需要更改数组长度、拷贝以及移动元素位置&#xff1b;查询快&#xff1a;由于数组在内…

SSM学生社团管理系统—计算机毕业设计源码20360

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3论文结构与章节安排 2 学生社团管理系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据增加流程 2.2.2 数据修改流程 2.2.3 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系…

YouTube最好用的翻译插件

相信很多同学和我一样&#xff0c;想看YouTube视频时发现基本上都说英文&#xff0c;以我的英文水平&#x1f923;去观看真是一言难尽&#xff0c;所以就想着看能不能在谷歌浏览器上找一个插件来进行翻译&#xff0c;结果还真让我找到了一个不错的Youtube翻译插件&#xff0c;它…