uniapp 自定义导航栏增加首页按钮,仿微信小程序操作胶囊

实现效果如图

抽成组件navbar.vue,放入分包

javascript 复制代码
<template>
	<view class="header-nav-box"
		:style="{'height':Props.imgShow?'':statusBarHeight+'px','background':Props.imgShow?'':Props.bgColor||'#ffffff;'}">
		<!-- 是否使用图片背景 false -->
		<image v-if="Props.imgShow||false" :src="imgUrl||'../../static/flower.jpg'" mode="scaleToFill"
			style="width: 100%; height: 400rpx;" />
		<!-- 导航内容 -->
		<view class="nav-box-item" :style="{'top':capsuleTop+'px','color':Props.textColor||''}">
			<view class="back" v-if="Props.blackShow||true" >
				<uni-icons type="back" @click="back" size="18" :color="Props.iconColor||'black'" />
				<text class="line" />
				<uni-icons type="home" @click="backToHome" size="18" :color="Props.iconColor||'black'" />
			</view>
			<view class="title">
				<block>{{title}}</block>
			</view>
		</view>
		<!-- 自定义内容插槽 -->
		<slot name="content"></slot>
	</view>
</template>
 
<script>
	export default {
		name: "HeaderNav",
		data() {
			return {
              statusBarHeight:'',
			  capsuleTop:''
			};
		},
		props: {
		    height:{
				type: String,
				default: ''
			},
			Props: {
				type: Object,
				default: () => {}
			},
			title: {
				type: String,
				default: '默认标题'
			}
		},
		mounted() {
			var _self=this
			uni.getSystemInfo({
				success: function (e) {
				let custom = uni.getMenuButtonBoundingClientRect();
				  _self.statusBarHeight = custom.bottom + custom.top - (e.statusBarHeight) + 4
				},
			})
			this.capsuleTop = getApp().globalData.capsuleTop
		},
		methods: {
			// 返回按钮回调函数
			back() {
				uni.navigateBack({
					data: 1
				})
				this.$emit('back')
			},
			backToHome(){
              this.$tab.reLaunch('/pages/index') //放入自己的首页路径
			},
		}
	}
</script>
 
<style lang="scss">
	.header-nav-box {
		position: relative;
 
		.nav-box-item {
			height: 54rpx;
			position: absolute;
			display: flex;
			align-items: center;
			font-size: 34rpx;
			width: 100%;
 
			.back {
				width: 23%;
				padding: 10rpx;
				justify-content: space-around;
                display: flex;
				border-radius: 50rpx;
				// background-color: #ff8916;
				border: 1px solid rgba(0, 0, 0, .1);
			}
 
			.title {
				width: 49%;
				text-align: center;
			}
		}
	}
	.home {
		margin-left: 10rpx;
	}
	.line {
		width: 10rpx;
		height: 36rpx;
		background-color: rgba(252, 252, 252, .7);
	}
</style>

全局引用

javascript 复制代码
// 在main.js引用
// 注册全局组件
import HeaderNav from "./subPackage/navbar/index.vue" //换成你自己的组件位置
Vue.component("HeaderNav", HeaderNav)

使用

javascript 复制代码
<HeaderNav title="你自己的页面路由名称"  />
// 可以传入的参数说明
Props: {
	imgShow: "", //不传参则默认隐藏状态(false),且使用默认背景色
	statusBarHeight: "", //导航高度(动态获取传参)
	bgColor: "", //导航栏背景色,不传参则默认#9CF
	capsuleTop: "", //胶囊顶部距离(动态获取传参)
	textColor: "", //导航标题字体颜色(不传默认#FFF)
	iconColor: "", //icon图标颜色(不传默认#FFF)
	blackShow: "", //是否显示返回字体及icon图标(不传默认显示true)
	backText: "", //默认字体(返回)
},
复制代码
相关推荐
2501_9339072113 小时前
深圳本凡科技专业企业APP开发,助力手机应用创新优化
科技·微信小程序·小程序
EchoEcho13 小时前
深入理解 Vue.js 渲染机制:从声明式到虚拟 DOM 的完整实现
vue.js
C澒13 小时前
Vue 项目渐进式迁移 React:组件库接入与跨框架协同技术方案
前端·vue.js·react.js·架构·系统架构
xiaoxue..14 小时前
合并两个升序链表 与 合并k个升序链表
java·javascript·数据结构·链表·面试
要加油哦~14 小时前
AI | 实践教程 - ScreenCoder | 多agents前端代码生成
前端·javascript·人工智能
一个public的class14 小时前
你在浏览器输入一个网址,到底发生了什么?
java·开发语言·javascript
青茶36014 小时前
php怎么实现订单接口状态轮询请求
前端·javascript·php
火车叼位15 小时前
脚本伪装:让 Python 与 Node.js 像原生 Shell 命令一样运行
运维·javascript·python
VT.馒头15 小时前
【力扣】2727. 判断对象是否为空
javascript·数据结构·算法·leetcode·职场和发展
发现一只大呆瓜15 小时前
虚拟列表:从定高到动态高度的 Vue 3 & React 满分实现
前端·vue.js·react.js