uniapp——自定义导航栏的封装

为什么需要封装自定义导航

  1. 首先如果开发的是微信小程序,那么在安卓环境下导航栏标题是默认靠左对齐的(虽然你在微信开发者工具上看到的依旧是居中展示),而在ios环境则是居中展示的。
  2. 很多时候我们需要对整个项目有一个主题色或者公共的样式配置,封装一个公共的自定义导航栏更易于实现与管理。
  3. 系统导航栏高度根据机型会发生变化,大部分是44px,但是有时候也会是40px等高度,如果你需要针对导航栏和状态栏高度对页面做一些定制需求那会显得比较困难。(网上有一些根据胶囊按钮获取导航栏高度的方法实测后发现并不精准。)

当然原生导航也并不是一无是处的。原生导航的体验更好,渲染新页面时,原生导航栏的渲染无需等待新页面dom加载,可以在新页面进入动画开始时就渲染。原生导航还可以避免滚动条通顶,并方便的控制原生下拉刷新。

封装思路

这里我们借助uniapp官方提供的uni-nav-bar进行封装。(vue3 + ts + setup)

  1. 首先,我们希望可以自动获取每个页面的标题,并不是每次使用自定义组件再去设置,我们置顶page.json里面包含了我们所有的页面的标题,所以我们直接导入该文件,使用currentPage获取当前页面的路由,然后匹配page.json文件里面的page或者subPackages路由,需要注意的是subPackages里面的路由需要自己收到拼装。
    const { title, ...$attrs } = useAttrs()
    const defaultTitle = '我是默认标题'
    // 通过page.json文件里面的pages与subPackages数组自动获取标题栏
    const getCurrentPageTitle = () => {// 有传入的标题直接使用传入的标题if (title) {return title}const { route } = currentPage()const page = pagesjson.pages.find((item) => item.path === route)if (page) {return page.style?.navigationBarTitleText || defaultTitle}for (const subPackage of pagesjson.subPackages) {const subPage = subPackage.pages?.find((item) => route === `${subPackage.root}/${item.path}`)if (subPage) {return subPage.style?.navigationBarTitleText || defaultTitle}}
    }
    
  2. 然后我们使用getCurrentInstance和``createSelectorQuery定义一个方法返回自定义导航栏的高度,便于我们需要的时候使用。
    const pageInstace = getCurrentInstance()
    const emits = defineEmits(['getHeight'])
    onMounted(() => {const query = uni.createSelectorQuery().in(pageInstace?.proxy)query.select('.uniNavBar').boundingClientRect((data: any) => {emits('getHeight', data.height + 'px')}).exec()
    })
    
  3. 最后我们还需使用$attrs对组件的属性方法进行穿透,这在我们对组件进行二次封装的时候应该都是必须要做的操作。

完整代码

<template><uni-nav-barclass="uniNavBar"v-bind="$attrs":border="border":statusBar="statusBar":fixed="fixed":leftIcon="leftIcon":title="getCurrentPageTitle()"@clickLeft="clickLeft"></uni-nav-bar>
</template><script lang="ts" setup>
import { onMounted, getCurrentInstance } from 'vue'
import { useAttrs } from 'vue'
import pagesjson from '@/pages.json'
import { currentPage } from '@/utils/tools'interface Props {border?: booleanstatusBar?: booleanfixed?: booleanleftIcon?: string
}const props = withDefaults(defineProps<Props>(), {border: false,statusBar: true,fixed: true,leftIcon: 'left',
})const { title, ...$attrs } = useAttrs()
const pageInstace = getCurrentInstance()
const emits = defineEmits(['getHeight'])
onMounted(() => {const query = uni.createSelectorQuery().in(pageInstace?.proxy)query.select('.uniNavBar').boundingClientRect((data: any) => {emits('getHeight', data.height + 'px')}).exec()
})const defaultTitle = '我是默认标题'
// 通过page.json文件里面的pages与subPackages数组自动获取标题栏
const getCurrentPageTitle = () => {// 有传入的标题直接使用传入的标题if (title) {return title}const { route } = currentPage()const page = pagesjson.pages.find((item) => item.path === route)if (page) {return page.style?.navigationBarTitleText || defaultTitle}for (const subPackage of pagesjson.subPackages) {const subPage = subPackage.pages?.find((item) => route === `${subPackage.root}/${item.path}`)if (subPage) {return subPage.style?.navigationBarTitleText || defaultTitle}}
}// navbar返回按钮事件
const clickLeft = () => {uni.navigateBack()
}
</script>

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

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

相关文章

一步直达 - CDPATH的妙用

文章目录 一步直达 - CDPATH的妙用更多信息 一步直达 - CDPATH的妙用 适用于贼长的目录路径 如果你的目录路径贼长&#xff0c;一定要用一下这个命令。 变量CDPATH定义了目录的搜索路径&#xff0c;这个设置特别适合经常需要进入到某个目录&#xff0c;此时这个设置就及其有用…

(每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第6章 项目管理理论(一)

博主2023年11月通过了信息系统项目管理的考试&#xff0c;考试过程中发现考试的内容全部是教材中的内容&#xff0c;非常符合我学习的思路&#xff0c;因此博主想通过该平台把自己学习过程中的经验和教材博主认为重要的知识点分享给大家&#xff0c;希望更多的人能够通过考试&a…

直线模组的适用性

直线模组是由直线运动导向部件和滑块组成的&#xff0c;是一种常见的机械元件&#xff0c;主要用于传输力和运动&#xff0c;其结构简洁&#xff0c;安装方便&#xff0c;耐用高效&#xff0c;广泛应用于各行各业&#xff0c;并且可以通过调整其长度和直径来适应不同的应用场景…

rust跟我学:文件时间属性获得方法

图为RUST吉祥物 大家好,我是get_local_info作者带剑书生,这里用一篇文章讲解get_local_info是怎样获得杀毒软件的病毒库时间的。 首先,先要了解get_local_info是什么? get_local_info是一个获取linux系统信息的rust三方库,并提供一些常用功能,目前版本0.2.4。详细介绍地址…

Vue-路由-声明式导航

1. 导航链接 vue-router 提供了一个全局组件 router-link (取代 a 标签) 能跳转&#xff0c;配置 to 属性指定路径(必须) 。本质还是 a 标签 &#xff0c;to 无需 #能高亮&#xff0c;默认就会提供高亮类名&#xff0c;可以直接设置高亮样式 如&#xff1a; <div class&…

反序列化提升刷题

例题&#xff1a; <?php //flag is in flag.php highlight_file(__FILE__); error_reporting(0); class Modifier { private $var; public function append($value) { include($value); echo $flag; } public function __invoke(){ …

LabVIEW编码器自动校准系统

简介 在工作中&#xff0c;精确的角度测量和校准对于保持设备精度至关重要。开发了一套自动化角度编码器校准系统&#xff0c;利用了LabVIEW的强大功能。该系统以全圆连续角度标准装置为基础&#xff0c;配合二维导轨装夹系统&#xff0c;实现了空心轴角度编码器的高效自动校…

GitHub高级搜索技巧

GitHub高级搜索技巧 in:name <关键字> 仓库名称带关键字查询 in:description <关键字> 仓库描述带关键字查询 in:readme <关键字> README文件带关键字查询 stars(fork): >() <数字> <关键字> star或fork数大于(或等于)指定数字的带关键字查…

RAG词嵌入召回质量评估

一、目录 1 采用官方评估器进行评估 2 Open Ai的key分享 3 采用gpt 生成词嵌入的训练集 4 微调sentence_transformer模型 5 评估sentence_transformer模型 二、实现 官方网址&#xff1a;https://github.com/run-llama/finetune-embedding/blob/main/evaluate.ipynb 1.采用官…

红日靶场5

目录 前言 外网渗透 信息收集 1、arp探测 2、nmap 3、nikto 4、whatweb 5、gobuster 6、dirsearch 漏洞探测 ThinKPHP漏洞 漏洞利用 get shell 内网渗透 信息收集 CS 启动&#xff01; CS连接 CS信息收集 1、hashdump 2、猕猴桃 3、端口扫描 MSF启动&…

QT中程序执行时间精准计算的三种方法及对比

一.QT程序在提升程序性能的调试中经常要计算一段程序的执行时间&#xff0c;下面介绍两种简单的实现方式&#xff0c;精确度都可以达到ms。 1.方式一 &#xff08;1&#xff09;代码&#xff1a; #include <QDateTime> qDebug() << "Current_date_and_tim…

ubuntu server配置无线网络

1 配置文件 进入 Netplan 配置目录&#xff0c;查看其中的默认配置文件&#xff1a; $ cd /etc/netplan/ $ ls 50-cloud-init.yaml此机器上的配置文件名为 50-cloud-init.yaml。由于安装方式、系统版本等差异&#xff0c;配置文件的名称可能有所不同&#xff0c;但都是 yaml …

Git使用统一规范

为什么要统一git使用的风格&#xff1f; 统一的风格使我们在工作的时候无需考虑工作流程上该如何去做的问题&#xff0c;按照一个风格去做就好了每个人风格不同&#xff0c;格式凌乱&#xff0c;查看很不方便commit没有准确的message&#xff0c;后续难以追踪问题 git messag…

项目架构之Zabbix部署

1 项目架构 1.1 项目架构的组成 业务架构&#xff1a;客户端 → 防火墙 → 负载均衡&#xff08;四层、七层&#xff09; → web缓存/应用 → 业务逻辑&#xff08;动态应用&#xff09; → 数据缓存 → 数据持久层 运维架构&#xff1a;运维客户端 → 跳板机/堡垒机&#x…

JVM基础(4)——JVM存活判定算法

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…

C++ 实现十大排序算法

教你手撕排序&#xff0c;这里有一个概念就是稳定排序。假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&#xff0c;若经过排序&#xff0c;这些记录的相对次序保持不变&#xff0c;即在原序列中&#xff0c;r[i]r[j]&#xff0c;且r[i]在r[j]之前&#…

第十三讲 单片机驱动彩色液晶屏 bin档的烧录方法

单片机驱动TFT彩色液晶屏系列讲座 目录 第一讲 单片机最小系统STM32F103C6T6通过RA8889驱动彩色液晶屏播放视频 第二讲 单片机最小系统STM32F103C6T6控制RA8889驱动彩色液晶屏硬件框架 第三讲 单片机驱动彩色液晶屏 控制RA8889软件:如何初始化 第四讲 单片机驱动彩色液晶屏 控…

Java生成四位数随机验证码

引言&#xff1a; 我们生活中登录的时候都要输入验证码&#xff0c;这些验证码是为了增加注册或者登录难度&#xff0c;减少被人用脚本疯狂登录注册导致的一系列危害&#xff0c;减少数据库的一些压力。 毕竟那些用脚本生成的账号都是垃圾账号 本次实践&#xff1a;生成这样的…

R语言【paleobioDB】——pbdb_scales():返回多个时间刻度的基本信息

Package paleobioDB version 0.7.0 paleobioDB 包在2020年已经停止更新&#xff0c;该包依赖PBDB v1 API。 可以选择在Index of /src/contrib/Archive/paleobioDB (r-project.org)下载安装包后&#xff0c;执行本地安装。 Usage pbdb_scales (...) Arguments 参数【...】&am…

CMake+QT+大漠插件的桌面应用开发

文章目录 CMakeQT大漠插件的桌面应用开发简介环境项目结构配置编译环境代码 CMakeQT大漠插件的桌面应用开发 简介 在CMake大漠插件的应用开发——处理dm.dll&#xff0c;免注册调用大漠插件中已经说明了如何免注册调用大漠插件&#xff0c;以及做了几个简单的功能调用&#x…