自定义导航栏

组件效果展示:


WeChat3e85da45b15f5a36e08f1ebbbc5ad526.jpg
WeChatab9c23b794f57952a9783d55562e5d56.jpg

解决的问题:
1. 使用uni.getSystemInfoSync获取到当前手机的状态栏区域的高度和手机型号
2. 通过获取到的手机型号来判断,如果是ios就+40px,否则就+44px
3. 导航栏高度 = 手机状态栏高度 + 40(ios)或44(安卓)
4. 导航栏组件, 外层一个 view 充当导航栏, 里面嵌套一个 view 用来充当 naviBar, 将动态获取的状态栏高度赋给外层的 padding-top
5. 通过延迟500毫秒解决 IOS 真机无法第一时间获取状态栏高度的问题
6. 原本想考虑给自定义导航添加插槽,增加组件灵活性,实际发现并不实用
7. 该组件刚开始使用默认高度 88px, 然后在根据获取的数据动态调整,解决组件展示时闪屏问题
该组件满足导航的基本使用

自定义组件:

<!-- 
   使用示例:
      1.右item显示新增 (默认)
       <kNavBar name='这是标题'  @goBack="goBack" @goAdd="goAdd" >
      2.右item 显示文字
      <kNavBar name='这是标题' rightText="按钮"  @goBack="goBack" @goText="goText"  >
      3.右item为空
      <kNavBar name='这是标题' rightText=" "   @goBack="goBack" >
 -->

<template>
    <view>
        <view class="topNav" :style="{paddingTop: (statusBarHeight || 44) + 'px'}">
            <view class="naviBar" :style="{ height : (navBarHeight || 44) + 'px'}">
                <!-- 返回按钮 -->
                <image class="nav-left" src="../static/fanhui.png" v-if="isBack" mode="aspectFit" @tap="goBack"></image>
                <!-- 标题 -->
                <view class=" navi-title">{{name}}</view>
                <!--  右边新增按钮 -->
                <view class="nav-right" v-if="rightText.length > 0" @tap="goText">{{rightText}}</view>
                <image class="nav-right-img" v-else src="../static/add.png" mode="" @tap="goAdd"></image>
            </view>
        </view>
        <!--  空白块, 填补空缺 -->
        <view class="" :style="{height : (navHeight || 88) + 'px'} "></view>
    </view>
</template>

<script>
    export default {
        props: {
            // 返回按钮是否隐藏
            isBack: {
                type: Boolean,
                default () {
                    return true
                }
            },
            //  标题
            name: {
                type: String,
                default () {
                    return ''
                }
            },
            // 右边按钮的文字
            rightText: {
                type: String,
                default () {
                    return ''
                }
            }
        },

        data() {
            return {
                statusBarHeight: 0, //  状态栏的高度
                navBarHeight: 0, //  导航条的高度
                navHeight: 0, //    导航栏高度
            };
        },

        created() {
            const that = this
            setTimeout(() => {
                let {
                    statusBarHeight,
                    system
                } = uni.getSystemInfoSync()
                //  网页调试时, statusBarHeight 若为 0 ,则给一个默认高度
                that.statusBarHeight = statusBarHeight > 0 ? statusBarHeight : 44
                // 导航条的高度 =  iOS 40px  /  安卓 44px  
                that.navBarHeight = (system.indexOf("iOS") > -1 ? 40 : 44)
                // 导航栏的高度 = 手机状态栏高度 + 40px(IOS) / 44px(安卓)
                that.navHeight = that.statusBarHeight + that.navBarHeight
            }, 500); // 延迟500毫秒再尝试获取
        },

        methods: {
            // 返回事件
            goBack() {
                this.$emit('goBack')
            },
            // 新增事件
            goAdd() {
                this.$emit('goAdd')
            },
            // 文字事件
            goText() {
                this.$emit('goText')
            },
        }
    }
</script>

<style scoped>
    .topNav {
        /* background-color: #00aa7f; */
        /* 背景图片 */
        background-image: url('@/static/bgimg.png');
        background-repeat: no-repeat;
        background-size: 100% 100%;
        /*  定位 */
        position: fixed;
        top: 0;
        left: 0;
        right: 0;
        z-index: 999;
    }

    .naviBar {
        position: relative;
        display: flex;
        /* 侧轴布局 */
        align-items: center;
        /* 主轴布局 */
        justify-content: flex-start;
        padding: 0 20rpx;
        box-sizing: border-box;
    }

    .navi-title {
        width: 70%;
        font-size: 17px;
        color: #fff;
        /* 居中 */
        text-align: center;
        margin: 0 auto;
        /* background-color: pink; */
    }

    .nav-left {
        width: 40rpx;
        Height: 40 rpx;
        padding-right: 50rpx;
        position: absolute;
        left: 20rpx;
        /* background-color: orange; */
    }

    .nav-right-img {
        width: 40rpx;
        Height: 40 rpx;
        position: absolute;
        right: 25rpx;
        /* background-color: orange; */
    }

    .nav-right {
        font-size: 15px;
        color: #fff;
        position: absolute;
        right: 25rpx;
        /* background-color: orange; */
    }
</style>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容