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

news2024/9/30 11:31:45

最近公共组件写到导航条,本来打算拿已有的改。看了下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.coloradmin.cn/o/2066227.html

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

相关文章

深度学习----------------------残差网络ResNet

目录 ResNet加更多的层总是改进精度吗&#xff1f;残差块ResNet块细节不同的残差块ResNet块ResNet架构总结 ResNet代码实现残差块输入和输出形状一致增加输出通道数的同时&#xff0c;减半输出的高和宽ResNet模型观察ResNet中不同模块的输入形状是如何变化的训练模型 问题ResNe…

JRE和JDK概念区分

1.JRE Java Runtime Environment&#xff1a;java运行环境。JVMJava类库。开发好的java程序&#xff0c;直接运行&#xff0c;可只安装JRE。 2.JDK Java Development Kit&#xff1a;java软件开发工具包。JREJava开发工具。编译、运行java代码。 3.总结 JRE就是运行Java字…

制作网页底部以及<footer>置底

目录 前言 页脚置底 页脚置底的几种方法 使用calc()设置内容高度 使用flex布局 将内容部分的margin-bottom改为负值【不推荐】 一个网页底部Demo HTML部分&#xff1a; CSS部分&#xff1a; 效果&#xff1a; 其他说明 margin负值特性 下面以一个具体的例子来说明…

Edge-TTS:微软推出的,免费、开源、支持多种中文语音语色的AI工具[Python代码]

Edge-TTS&#xff0c;由微软推出的这款免费、开源的AI工具&#xff0c;为用户带来了丰富多样的中文语音体验。它不仅支持多种中文语音语色&#xff0c;还能实现流畅自然的语音合成。Edge-TTS凭借其高度可定制化的特点&#xff0c;广泛应用于智能助手、语音播报、教育培训等领域…

加速自动驾驶模型迭代,数据存算一体是关键

自动驾驶的每一个业务阶段都会涉及到 AI 深度学习算法和算力的参与&#xff0c;机器视觉&#xff0c;深度学习&#xff0c;传感器技术等均在自动驾驶领域发挥着重要的作用。自动驾驶系统不断迭代的前提是算法的持续优化&#xff0c;目前&#xff0c;自动驾驶发展的瓶颈主要在于…

【笔记】0基础python学爬虫(未完)

&#xff08;一&#xff09;用requests发送get请求 安装好pycharm&#xff08;跳过&#xff09; 在本地控制台输入pip install requests 安装requests模块 with防止资源浪费 不论f文件有没有执行成功最后都会关闭 请求获取url resp requests.get(url) resp.text获取源代码…

Redis的持久化、主从架构、哨兵高可用架构

目录 1.Redis持久化 1.1 RDB快照 1.2AOF 1.3混合持久化 2.Redis主从架构 2.1主从工作原理 2.1.1全量复制 2.1.2增量复制 3.Redis哨兵高可用架构 3.1哨兵架构模型 3.2哨兵模式的作用 3.3故障转移机制 3.4主节点选举机制 4.Redis管道-pipeline 1.Redis持久化 有两种…

MyBatis-Plus 一、(基础应用)

MyBatis-Plus&#xff08;简称 MP&#xff09;是一个 MyBatis (opens new window)的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 mybatis 、mybatis-plus 二者区别&#xff1a; MyBatis: 所有SQL语句全部自己写手动解析实…

EPCE-HDR

【GitHub】 【Paper】 摘要 由于相机能力的限制&#xff0c;数字图像通常比真实场景辐射更窄的动态光照范围。为了解决这个问题&#xff0c;高动态范围&#xff08;HDR&#xff09;重建被提出&#xff0c;以恢复动态范围&#xff0c;更好的表示真实世界的场景。然而&#xff0c…

haproxy编译安装

一、haproxy简介 HAProxy是一个使用C语言编写的自由及开放源代码软件&#xff0c;其提供高可用性、负载均衡&#xff0c;以及基于TCP和HTTP的应用程序代理。 HAProxy特别适用于那些负载特大的web站点&#xff0c;这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬…

Ubuntu 22.04中MySQL 8 设置忽略大小

Ubuntu 22.04中MySQL 8 设置忽略大小 一、解决完整流程 //根据官网内容说的大概意思就是不能安装完了修改忽略大小写了&#xff0c;只能在初始化的时候做修改。我用的版本是8.0.39//更新软件包 1、sudo apt update //安装MySQL 如果安装了可以忽略这个步骤 2、sudo apt insta…

【计算机三级-数据库技术】数据库及数据库对象

数据库及数据库对象 第一节 创建及维护数据库 一、SQL server数据库分类 1&#xff09;系统数据库&#xff08;系统自动创建&#xff09;&#xff1a; master、msdb、tempdb、model、resource 2&#xff09;用户数据库 保存与用户业务有关的数据。 二、SQL server数据库组成…

【660线代】线性代数一刷错题整理

线代一阶 2024.8.7日 1. 2. 2024.8.8日 1. 2024.8.9日 1. 2. 3. 2024.8.12日 1. 2. 2024.8.13日 1. 2. 3. 2024.8.15日 1. 2. 3. 4. 5. 6. 线代二阶 2024.8.17日 1. 2. 3. 2024.8.18日 1. 至此&#xff0c;660线性代数部分完成。 祝各位一战成硕&#xff01;

鸿蒙关于可以实现滚动效果的容器组件的相关知识

一、滚动的用途 生活中&#xff0c;我们在使用各种APP应用的过程中&#xff0c;总是可以看到一些轮播图、内容页面的滑动、组件切换的效果等&#xff0c;这些都是为了提高用户的体验而设计的功能。在编程中&#xff0c;滚动的用途非常广泛&#xff0c;我们经常用在用户界面的交…

Umi-OCR 文字识别工具

免费开源的离线orc识别功能 git地址 感谢大佬的贡献 Umi-OCR 文字识别工具 使用说明 • 下载地址 • 更新日志 • 提交Bug 免费&#xff0c;开源&#xff0c;可批量的离线OCR软件 适用于 Windows7 x64 、Linux x64 免费&#xff1a;本项目所有代码开源&#x…

C++ 程序寻找通过 2 个点的线(Program to find line passing through 2 Points)

在数学和计算机科学中&#xff0c;找到通过两个点的线的方程是一个基础问题。假设我们有两个点 P1​(x1​,y1​) 和 P2​(x2​,y2​)&#xff0c;我们想要找到通过这两个点的直线方程。 直线方程的形式 直线的方程通常表示为 ymxb&#xff0c;其中 m 是斜率&#xff0c;b 是 …

PMP核心知识点—之项目管理基础

知识点1&#xff1a;项目的临时性 项目的临时性是指项目有明确的开始时间和结束时间&#xff0c;但并不能表示项目的周期短&#xff0c;项目的周期从几个月、几年到几十年都有。 知识点2&#xff1a;项目的独特性 独特的产品、服务或成果。 知识点3&#xff1a;项目创造商业价值…

ARCGIS 纸质小班XY坐标转电子要素面

1、准备好excel 坐标 小班号、点位链接的顺序、X、Y 4个缺一不可&#xff0c;需要注意的是&#xff0c;点位顺序的格式最好为数字&#xff0c;若为其他格式可能会出现排序混乱&#xff0c;会以1-9 11-19等字符串的排序连接。 excel文件转为csv才能识别&#xff0c;CSV只能保留第…

错过了游科的黑神话?别急,国内这些公司也在招聘中,都是做3A游戏的,速来!

近日&#xff0c;由游戏科学工作室打造的3A游戏——《黑神话:悟空》&#xff0c;不仅在国内引起了前所未有的关注&#xff0c;在全球范围内也引发了巨大轰动。 游戏玩家们举国欢庆的同时&#xff0c;无数游戏从业者也点燃了对国产3A游戏的憧憬与期待&#xff01; 据说游科在某…

Java 通用代码生成器光,电音之王尝鲜版八,完善数据库自动反射功能和多对多候选功能

Java 通用代码生成器光&#xff0c;电音之王尝鲜版八&#xff0c;完善数据库自动反射功能和多对多候选功能 Java 通用代码生成器光&#xff0c;电音之王尝鲜版八&#xff0c;此版本完善了数据库自动反射功能。完善了多对多候选功能。尝鲜版八在以前的版本上修复了大量缺陷和功…