uniapp+vue2+uview2.0导航栏组件二次封装

样式


代码

html 复制代码
<template>
	<view class="navBar">
		<u-navbar :title="title" :titleColor="titleColor" :bgColor="bgColor" :safeAreaInsetTop="safeAreaInsetTop"
			:autoBack="true" @leftClick="leftClick" @rightClick="rightClick">
			<view class="u-nav-slot" slot="left">
				<u-icon name="arrow-left" size="19" v-if="isSubPage"></u-icon>
				<u-icon name="home" size="20" v-if="!isSubPage"></u-icon>
			</view>
		</u-navbar>
		<view style="height: 46px;" v-if="!placeholder"></view>
	</view>
</template>

<script>
	/**
	 * NavBar导航
	 * @description 二次封装u-navbar
	 * @property {Boolean}			safeAreaInsetTop		是否开启顶部安全区适配
	 * @property {Boolean}			placeholder				固定在顶部时,是否生成一个等高元素,以防止塌陷
	 * @property {Boolean}			fixed				    导航栏是否固定在顶部
	 * @property {Boolean}			border				    导航栏底部是否显示下边框
	 * @property {String}			leftIcon				左边返回图标的名称
	 * @property {String}			leftText				左边的提示文字
	 * @property {String}			rightText				右边的提示文字
	 * @property {String}			rightIcon				右边返回图标的名称,只能为uView自带的图标
	 * @property {String}			title		            导航栏标题
	 * @property {String}			bgColor				    导航栏背景设置
	 * @property {String | Number}	titleWidth			    导航栏标题的最大宽度,内容超出会以省略号隐藏,单位rpx
	 * @property {String | Number}	height				    导航栏高度(不包括状态栏高度在内,内部自动加上)单位px
	 * @property {String | Number}	leftIconSize			左侧返回图标的大小
	 * @property {String}			leftIconColor			左侧返回图标的颜色
	 * @property {Boolean}			autoBack2.0.19		    点击左侧区域(返回图标),是否自动返回上一页
	 * @property {String | Object}	titleStyle 2.0.23		标题的样式,对象或字符串形式
	 * @event {Function}			leftClick				点击左侧区域触发
	 * @event {Function}			rightClick				点击右侧区域触发
	 * @example <navBar title="首页"/></navBar>
	 */

	export default {
		name: "navBar",
		props: {
			title: {
				type: String,
				default: '娱乐'
			},
			titleColor: {
				type: String,
				default: '#000000'
			},
			bgColor: {
				type: String,
				default: '#ffffff'
			},
			safeAreaInsetTop: {
				type: Boolean,
				default: false
			},
			placeholder: {
				type: Boolean,
				default: false
			},
			fixed: {
				type: Boolean,
				default: true
			},
			border: {
				type: Boolean,
				default: false
			},
		},
		data() {
			return {
				isSubPage: false, // 新增状态
			};
		},
		methods: {
			// 点击左侧区域
			leftClick() {
				if (this.isSubPage) {
					uni.navigateBack();
				} else {
					uni.switchTab({
						url: '/pages/index/index'
					}); 
				}
				this.$emit('leftClick');
			},
			// 点击右侧区域
			rightClick() {
				this.$emit('rightClick');
			},
		},
		mounted() {
			// 检查当前页面是否为二级页面
			let pages = getCurrentPages()
			this.isSubPage = pages.length > 1;
		}
	}
</script>

<style lang="scss" scoped></style>
相关推荐
很晚很晚了4 小时前
纯前端转全栈 Day 1:我从第一个 NestJS 接口开始
前端
Lee川5 小时前
从零解剖一个 AI Agent Tool是如何实现的
前端·人工智能·后端
wangruofeng6 小时前
Playwright 深度调研:为什么它成了浏览器自动化的新底座
前端·测试
李白的天不白8 小时前
SSR服务端渲染
前端
XinZong8 小时前
OpenClaw 实现「龙虾」vs 龙虾 vs 用户 ws对话实现方案 + 实际落地项目
javascript
卷帘依旧9 小时前
WebSocket 比 SSE 复杂在哪里
javascript
卷帘依旧9 小时前
SSE(Server-Sent Events)完全指南
前端
码云之上9 小时前
万星入坞:我们如何用三层插件体系干掉巨石应用
前端·架构·前端框架
kyriewen9 小时前
一口气讲清楚 Monorepo、Turborepo、pnpm、Changesets 到底是什么?
前端·架构·前端工程化
logo_289 小时前
Xpath语法规则的学习和使用
javascript·python·xpath·xpath语法