<template> <view class="page-app" :class="['theme-' + sys.mode, 'main-' + sys.theme, 'font-' + sys.fontSize]" > <view class="page-main" :style="[bgMain]"> <!-- 顶部导航栏-情况1:默认通用顶部导航栏 --> <su-navbar v-if="navbar === 'normal'" :title="title" statusBar :color="color" :tools="tools" :opacityBgUi="opacityBgUi" @search="(e) => emits('search', e)" :defaultSearch="defaultSearch" /> <!-- 顶部导航栏-情况2:装修组件导航栏-标准 --> <s-custom-navbar v-else-if="navbar === 'custom' && navbarMode === 'normal'" :data="navbarStyle" :showLeftButton="showLeftButton" /> <view class="page-body" :style="[bgBody]"> <!-- 顶部导航栏-情况3:沉浸式头部 --> <su-inner-navbar v-if="navbar === 'inner'" :title="title" /> <view v-if="navbar === 'inner'" :style="[{ paddingTop: sheep.$platform.navbar + 'px' }]" ></view> <!-- 顶部导航栏-情况4:装修组件导航栏-沉浸式 --> <s-custom-navbar v-if="navbar === 'custom' && navbarMode === 'inner'" :data="navbarStyle" :showLeftButton="showLeftButton" /> <!-- 页面内容插槽 --> <slot /> <!-- 底部导航 --> <s-tabbar v-if="tabbar !== ''" :path="tabbar" /> </view> </view> <view class="page-modal"> <!-- 全局授权弹窗 --> <s-auth-modal /> <!-- 全局分享弹窗 --> <s-share-modal :shareInfo="shareInfo" /> <!-- 全局快捷入口 --> <s-menu-tools /> </view> </view> </template> <script setup> /** * 模板组件 - 提供页面公共组件,属性,方法 */ import { computed, reactive, ref } from 'vue'; import sheep from '@/sheep'; import { isEmpty } from 'lodash-es'; import { onShow } from '@dcloudio/uni-app'; // #ifdef MP-WEIXIN import { onShareAppMessage } from '@dcloudio/uni-app'; // #endif const props = defineProps({ title: { type: String, default: '', }, navbar: { type: String, default: 'normal', }, opacityBgUi: { type: String, default: 'bg-white', }, color: { type: String, default: '', }, tools: { type: String, default: 'title', }, keyword: { type: String, default: '', }, navbarStyle: { type: Object, default: () => ({ styleType: '', type: '', color: '', src: '', list: [], alwaysShow: 0, }), }, bgStyle: { type: Object, default: () => ({ src: '', color: 'var(--ui-BG-1)', }), }, tabbar: { type: [String, Boolean], default: '', }, onShareAppMessage: { type: [Boolean, Object], default: true, }, leftWidth: { type: [Number, String], default: 100, }, rightWidth: { type: [Number, String], default: 100, }, defaultSearch: { type: String, default: '', }, //展示返回按钮 showLeftButton: { type: Boolean, default: false, }, }); const emits = defineEmits(['search']); const sysStore = sheep.$store('sys'); const userStore = sheep.$store('user'); const appStore = sheep.$store('app'); const modalStore = sheep.$store('modal'); const sys = computed(() => sysStore); // 导航栏模式(因为有自定义导航栏 需要计算) const navbarMode = computed(() => { if (props.navbar === 'normal' || props.navbarStyle.styleType === 'normal') { return 'normal'; } return 'inner'; }); // 背景1 const bgMain = computed(() => { if (navbarMode.value === 'inner') { return { background: `${props.bgStyle.backgroundColor} url(${sheep.$url.cdn( props.bgStyle.backgroundImage, )}) no-repeat top center / 100% auto`, }; } return {}; }); // 背景2 const bgBody = computed(() => { if (navbarMode.value === 'normal') { return { background: `${props.bgStyle.backgroundColor} url(${sheep.$url.cdn( props.bgStyle.backgroundImage, )}) no-repeat top center / 100% auto`, }; } return {}; }); // 分享信息 const shareInfo = computed(() => { if (props.onShareAppMessage === true) { return sheep.$platform.share.getShareInfo(); } else { if (!isEmpty(props.onShareAppMessage)) { sheep.$platform.share.updateShareInfo(props.onShareAppMessage); return props.onShareAppMessage; } } return {}; }); // #ifdef MP-WEIXIN // 微信小程序分享 onShareAppMessage(() => { return { title: shareInfo.value.title, path: shareInfo.value.path, imageUrl: shareInfo.value.image, }; }); // #endif onShow(() => { if (!isEmpty(shareInfo.value)) { sheep.$platform.share.updateShareInfo(shareInfo.value); } }); </script> <style lang="scss" scoped> .page-app { position: relative; color: var(--ui-TC); background-color: var(--ui-BG-1) !important; z-index: 2; display: flex; width: 100%; height: 100vh; .page-main { position: absolute; z-index: 1; width: 100%; min-height: 100%; display: flex; flex-direction: column; .page-body { width: 100%; position: relative; z-index: 1; flex: 1; } .page-img { width: 100vw; height: 100vh; position: absolute; top: 0; left: 0; z-index: 0; } } } </style>