小程序自定义导航栏,其实就是这么简单

很多时候项目的需求导致我们必须自定义小程序的一些东西,虽然小程序自身的这些比较好用,但是可扩展性很差,不能满足我们的需求,比如我遇到的就是导航栏加上分享图标,这种只能自定义去写了,下面是我总结的一些东西,希望能够帮到你。

解决方案:

(1)单页面单独自定义导航,只兼容到7.0.0,不过现在也够用了
(2)全局自定义导航
bug:自定义导航可能会影响到小程序自带的下拉刷新,上拉加载等功能的实现,这个还要看具体问题。

如果较少页面需要自定义,建议使用第一种方案。
此时我们就需要用到自定义组件,如果不知道如何创建组件,请移步另一篇文章。
在这里插入图片描述
在这里插入图片描述

//组件nav.wxml
<view class="navbar" style='height:{{navH}}px;background:{{bgColor}}'>
  <view class="navbar-action-wrap" wx:if="{{showNav}}">
    <view wx:if="{{showHome}}" class="shareView" bindtap="showShare">
      <image class="shareIcon" mode='widthFix' src='/assets/images/share{{bgColor=="#fff"?"":"_white"}}.png'></image>
    </view>
    <view wx:if="{{showBack}}" class="backView" bindtap="toIndex">
      <image mode='widthFix' class="backIcon" src='/assets/images/leftIcon.png'></image>
    </view>
  </view>
  <view class='navbar-title' style='background:{{bgColor}};color:{{bgColor=="#fff"?"#333":"#fff"}}'>
    {{pageName}}
  </view>
</view>
  • bgColor是由父组件控制的,因为我标题栏有好几种状态,其中有一个是黄色背景,这里用这个变量来控制背景色
  • showNav是用来控制是否显示图标,因为我有的页面需要显示分享按钮或者返回按钮,有的页面什么图标都不要
  • showHome是控制是否显示分享按钮,showBack是控制是否显示返回按钮,里面的图片我用的是本地图,记得换成你们自己的图片啊
  • pageName是标题的内容
  • 以上这几个变量都需要父组件传值控制
//组件nav.json
{
  "component": true
}

注意:json文件里要设置一下

//组件nav.wxss
.navbar {
  width: 100%;
  overflow: hidden;
  position: relative;
  top: 0;
  left: 0;
  background-color: #fff;
  z-index: 90;
}
 
 
.navbar-title {
  width: 100%;
  height: 46px;
  line-height: 46px;
  text-align: center;
  position: absolute;
  bottom: 0;
  left: 0;
  z-index: 10;
  /* background-color: #fff;
  color: #333; */
  font-size: 18px;
}
 
.navbar-action-wrap{
  position: absolute;
  left: 10px;
  bottom: 7px;
  z-index: 100;
}
.navbar-action_item{
  padding:3px 0;
  color: #333;
}
.navbar-action-group .navbar-action_item{
 border-right: 1px solid #e8e8e8;
 padding:3px 12px;
}
.shareView{
  position: absolute;
  left: 0;
  bottom: 0;
  padding-left: 10px;
  padding-bottom: 4px;
  padding-right: 30px;
  z-index: 100;
}
.shareIcon{ 
  width: 28rpx;
  height: 28rpx;
  /* left: 10px;
  bottom: 7px; */
}
.backView{
  position: absolute;
  left: 0;
  bottom: -5px;
  padding: 0 30px 7px 0;
  z-index: 100;
}
.backIcon{
  width: 20rpx;
  height: 36rpx;
  /* left: 0px; */
}
 image.back{
  position: absolute;
  width: 20rpx;
  height: 36rpx;
  float: left;
  top: 28rpx;
  left: 30rpx;
}
//组件nav.js
const App = getApp();
Component({
  options: {
    addGlobalClass: true,
  },
  /**
   * 组件的属性列表
   */
  properties: {
    pageName: String,
    showNav: {
      type: Boolean,
      value: true
    },
    showHome: {
      type: Boolean,
      value: true
    },
    showBack: {
      type: Boolean,
      value: true
    },
    bgColor: {
      type: String,
      value: '#fff'
    },

  },

  /**
   * 组件的初始数据
   */
  data: {

  },
  lifetimes: {
    attached: function () {
      this.setData({
        navH: App.globalData.navHeight
      })
    }
  },
  /**
   * 组件的方法列表
   */
  methods: {
    //回退
    navBack: function () {
      wx.navigateBack({
        delta: 1
      })
    },
    showShare() {
      this.triggerEvent('showShare');
    },
    //回主页
    toIndex: function () {
      wx.reLaunch({
        url: '/pages/index/index'
      })
    },
  }
})

  • properties里面的值是接收父组件的传值
  • lifetimes里面是周期函数
  • this.triggerEvent(这里面是父组件的方法)

子组件现在就写好了,接下来我们就要在页面中引入使用
以index页面为例:
首先需要在json文件中声明要使用的组件:usingComponents{}
因为我们是自定义头部,所以需要再加上一句"navigationStyle":“custom”

//index.json
"usingComponents": {
    "navbar": "/components/navHeader/navHeader"
  },
"navigationStyle":"custom"

然后在index.wxml中引入组件

<view class="all_box">
	<navbar page-name="带货清单" bindshowShare="showShare" show-back="{{showBack}}" bg-color="{{showList?'#fff':'#FFDA6C'}}"></navbar>
	<view>这里是页面的内容</view>
</view>
//index.js
Page({
	data:{
		showBack:false,
    	bgColor:'#fff',
    	showList:true,//这里我是为了判断有没有数据,有数据的时候为true,没数据的时候为false,具体改变自己去写,我是在获取数据之后改变的
	},
	methods:{
  		showShare: function() {
    		console.log('这里是父组件的方法')
 	}
})

如果需要全局自定义导航,就在app.json去配置自定义

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值