123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- <template>
- <view v-if="visible" class="ax ax-custom-title" :style="{padding}">
- <view class="__body" :style="{height}">
- <slot>
- <view @click="back()">
- <text v-if="this.pages.length>1" class="icon-back"></text>
- <text class="title">{{title || titleText}}</text>
- </view>
- </slot>
- </view>
- </view>
- </template>
- <script>
- import PagesJSON from "@/pages.json";
- export default {
- name:"ax-custom-title",
- props:{
- // 显示首页按钮
- title:{type:String,default:''},
- // PC模式下无插槽内容也任然显示组件
- unlock:{type:Boolean,default:false},
- },
- data() {
- return {
- titleText: '',
- visible: false,
- padding: '0px',
- height: 'auto'
- };
- },
- async created() {
- const sys = await this.systemInfo();
- this.visible = sys.windowHeight === sys.screenHeight;
- if(this.visible==false) return;
- var rect = {top:0,left:0,right:0,bottom:0,width:0,height:0}
- if(sys.uniPlatform.indexOf('mp-')===0) rect = uni.getMenuButtonBoundingClientRect();
- var interval = sys.windowWidth - (rect.right || sys.windowWidth-10);
- const data = {
- top: rect.top,
- left: interval,
- right: (rect.width || interval*-1) + interval * 2,
- bottom: interval,
- componentHeight: rect.top+rect.height+interval,
- statusBarHeight: sys.statusBarHeight
- }
- var top = `${data.top}px`;
- var left = `${data.left}px`;
- var right = `${data.right}px`;
- var bottom = `${data.bottom}px`;
- if(['windows','mac'].includes(sys.platform)){
- top = 0;
- bottom = 0;
- right = left;
- rect.height = 45;
- if(this.unlock == false && !this.$slots.default) this.visible = false;
- }
- this.padding = [top,right,bottom,left].join(' ');
- this.height = `${rect.height || 50}px`;
- const currentPage = Array.from(getCurrentPages()).pop();
- const pageConfig = PagesJSON.pages.find(i=>i.path==currentPage.route);
- this.titleText = pageConfig.style.navigationBarTitleText;
- this.$emit('display',data);
- },
- computed:{
- pages(){
- return getCurrentPages();
- }
- },
- methods:{
- systemInfo(){
- return new Promise((resolve,reject)=>{
- uni.getSystemInfo({
- success: res=>resolve(res),
- fail: err=>reject(err)
- });
- });
- },
- back(){
- uni.navigateBack({delta: 1});
- }
- }
- }
- </script>
- <style scoped>
- @import url(../ax/ax.css);
- .ax-title-bar{
- width: 100vw;
- color: #000;
- position: relative;
- z-index: 999999;
- }
- .__body{
- display: flex;
- align-items: center;
- justify-content: space-between;
- }
- .__body::after{
- content: '';
- }
- .icon-back{
- margin-right: 5px;
- }
- .icon-back::before{
- content: "";
- display: inline-block;
- width: 10px;
- height: 10px;
- border-width: 0 0 2px 2px;
- border-style: solid;
- border-color: #000;
- transform-origin: center center;
- transform: rotate(45deg) translateY(-3px) translateX(1px);
- }
- </style>
|