美文网首页
小程序中自定义navigation组件

小程序中自定义navigation组件

作者: 银河系小前端 | 来源:发表于2019-10-02 18:26 被阅读0次

    有时候项目中需要在navigation中展示产品logo等信息,这时候就需要自定义navigation了。但是小程序中如果使用了自定义的navigation ,就默认每个页面的navigation都是自定义的,无法针对单个页面自定义navagation,先说一下思路。

    • 在app.js中获取手机屏幕高度、工具栏高度等信息,保存在app.globalData中
    • 由于自定义了navigation,页面上的100vh就会比原来变高,所以在navigation组件中要写两部分,一种是自定义的navigation自身,fixed在页面顶部,另一个是与navigation等高度的一个view,用来撑起页面的顶部。

    先贴上获取手机屏幕高度的代码:

    getSystemInfo: function () {
        wx.getSystemInfo({
            success: function (res) {
                console.log('用户手机型号=====', res)
            }
        })
        const systemInfo = wx.getSystemInfoSync();
        let iphoneX = '';
        if (systemInfo) {
            const { statusBarHeight, model, windowHeight } = systemInfo;
            let totalTopHeight = 68;
            if (model.indexOf('iPhone X') !== -1) {
                totalTopHeight = 94;
                iphoneX = 'iphone-x';
            } else if (model.indexOf('iPhone') !== -1) {
                totalTopHeight = 64;
            } else if (model.indexOf('MI 8') !== -1) {
                totalTopHeight = 88;
            }
            const titleBarHeight = totalTopHeight - statusBarHeight;
            this.globalData.systemInfo = {
                ...systemInfo,
                statusBarHeight,
                titleBarHeight,
                totalTopHeight,
                iphoneX,
                windowHeight,
            };
        }
    },
    

    navigation组件wxml部分:

    <!-- 随着页面可以下拉的,仅有背景色 -->
    <view class="navigation-temp" style="height: {{totalTopHeight}}px; padding-top: {{barHeight}}px; background-color: {{bgColor}}"></view>
    <!-- 固定在顶部的真实的导航 -->
    <view class="navigation" style="height: {{totalTopHeight}}px; padding-top: {{barHeight}}px; background-color: {{bgColor}}">
        <!-- 没有返回按钮 -->
        <view wx:if="{{showBackButton}}" class="slot" style="top: {{barHeight}}px">
            <slot></slot>
            <image class="logoImage" wx:if="{{isShowLogo}}" style="margin-top: {{logoMargin}}" src="{{logoSrc}}" mode="widthFix" />
        </view>
    
        <!-- 正常返回按钮 -->
        <block wx:else>
            <view catch:tap="onBack" class="back-btn" hover-class="hover" style="top: {{barHeight}}px" wx:if="{{showBackButton}}">
                <image class="nav-icon" src="{{navIconUrl}}" mode="aspectFit"></image>
            </view>
            <view class="title {{titleClass}}" style='{{navTitleStyle}}'>           <image wx:if="{{isShowLogo}}" class="{{headLogoStyle}}" src="{{logoSrc}}" />
                {{title}}
            </view>
        </block>
    </view>
    

    组件JS部分:

    //引入app中的变量
    const app = getApp();
    const { systemInfo } = app.globalData;
    const { statusBarHeight } = systemInfo;
    const { totalTopHeight } = systemInfo;
    const titleBarHeight = systemInfo ? systemInfo.titleBarHeight : 44;
    //定义属性
     properties: {
        // 是否展示头部logo
        isShowLogo: {
            type: Boolean,
            value: false,
        },
        // logo图片样式
        headLogoStyle: {
            type: String,
            value: 'width: 186rpx; height: 40rpx;',
        },
        // logo 图片地址
        logoSrc: {
            type: String,
            value: '/imgs/navigation_icon.png',
        },
        //  可传入改变navbar样式
        bgColor: {
            type: String,
            value: '#fff',
        },
        // 文字
        title: {
            type: String,
            value: '页面标题',
        },
        // 高度
        totalTopHeight: {
            type: Number,
            value: totalTopHeight,
        },
        textStyle: {
            type: String,
            value: 'white'
        },
        //  可传入改变nav back页面数
        delta: {
          type: Number,
          value: 1,
        },
        // 是否显示返回按钮
        showBackButton: {
            type: Boolean,
            value: true,
        },
      },
    data {
        barHeight: statusBarHeight,
        navIconUrl: config.imgUrl + 'miniapp/imgs/back_icon.png',
        navTitleStyle: 'color: #333;',
        navBgStyle: 'background-color: #fe7f43;',
        logoMargin: (titleBarHeight/2 - 19) + 'px',
    },
     methods: {
        onBack() {
              this.triggerEvent('onBack', {});
              const pages = getCurrentPages();
              if (this.data.showBackButton) {
                    if (pages.length > 1) {
                          wx.navigateBack({
                                delta: this.data.delta,
                          });
                    } else {
                          wx.switchTab({
                                url: '/pages/index/index',
                          });
                    }
              }
          }
      },
    

    页面中引用

    <navigation showBackButton="{{false}} " isShowLogo="{{true}}" bgColor="{{'#55adff'}}"></navigation>
    

    相关文章

      网友评论

          本文标题:小程序中自定义navigation组件

          本文链接:https://www.haomeiwen.com/subject/vfrrpctx.html