automated_uniapp/uni_modules/cool-ui/components/cl-topbar/cl-topbar.vue
2025-01-09 16:16:11 +08:00

140 lines
2.5 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view
class="cl-topbar"
:class="{
'is-border': border,
'is-fixed': fixed,
'is-ios': isIos,
'with-mp': withMp,
}"
:style="{
backgroundColor,
color,
zIndex,
paddingTop,
}"
>
<view
class="cl-topbar__content"
:style="{
color,
}"
>
<slot>
<view class="cl-topbar__text" @tap="tapTitle">
<text class="cl-topbar__title" v-if="title">{{ title }}</text>
<text class="cl-topbar__description" v-if="description">{{ description }}</text>
</view>
</slot>
</view>
<view class="cl-topbar__prepend">
<view class="cl-topbar__icon" v-if="showBack" @tap="back">
<text class="cl-icon-home" v-if="isFirst"></text>
<text class="cl-icon-arrow-left" v-else></text>
</view>
<slot name="prepend"></slot>
</view>
<view class="cl-topbar__append">
<slot name="append"></slot>
</view>
</view>
</template>
<script lang="ts">
import { computed, defineComponent, onMounted, ref } from "vue";
import { router } from "/@/cool";
import { isIos } from "/@/cool/utils";
const { statusBarHeight } = uni.getSystemInfoSync();
export default defineComponent({
name: "cl-topbar",
props: {
// 标题
title: String,
// 描述
description: String,
// 是否显示下边框
border: {
type: Boolean,
default: true,
},
// 是否固定
fixed: Boolean,
// 是否兼容小程序
withMp: Boolean,
// 是否显示返回按钮
showBack: {
type: Boolean,
default: true,
},
// 背景色
backgroundColor: {
type: String,
default: "#fff",
},
// 字体颜色
color: {
type: String,
default: "#000",
},
// 返回页面路径
backPath: String,
// 层级
zIndex: {
type: Number,
default: 99,
},
},
setup(props, { emit }) {
// 是否页面栈的第一个
const isFirst = ref(false);
// 顶部内边距
const paddingTop = computed(() => {
return props.fixed ? `${statusBarHeight}px` : 0;
});
// 返回
function back() {
if (isFirst.value) {
// H5页面刷新或者分享页时页面栈长度只有1。此时逐个验证返回的页面路径
if (props.backPath) {
router.push({
path: props.backPath,
mode: "reLaunch",
});
} else {
router.home();
}
} else {
router.back();
}
}
// 点击标题
function tapTitle(e: any) {
emit("title", e);
}
onMounted(() => {
const pages = getCurrentPages();
isFirst.value = pages.length == 1;
});
return {
isFirst,
paddingTop,
back,
tapTitle,
isIos,
};
},
});
</script>