微信小程序自定义tabbar,分为医生端和患者端模拟不同角色登录

自定义TabBar设置

介绍微信小程序如何自定义tabbarr界面,使用开发环境为微信开发原生工具,本文案例: 小程序有两个角色用户——医生端、患者端,每个角色进入小程序之后都有其所对应的tabbar界面, 隔离角色的权限,医生端无法进入患者端,患者端无法进入医生端。

1 成果展示
小程序进入界面:
患者登录入口:

医生登录入口:

2 开发步骤
2.1 了解tabbar的概念

自定义 tabBar 可以让开发者更加灵活地设置 tabBar 样式,以满足更多个性化的场景。

在自定义 tabBar 模式下

为了保证低版本兼容以及区分哪些页面是 tab 页,tabBar 的相关配置项需完整声明,但这些字段不会作用于自定义 tabBar 的渲染。 此时需要开发者提供一个自定义组件来渲染 tabBar,所有 tabBar 的样式都由该自定义组件渲染。推荐用 fixed 在底部的 cover-view + cover-image 组件渲染样式,以保证 tabBar 层级相对较高。 与 tabBar 样式相关的接口,如 wx.setTabBarItem 等将失效。 每个 tab 页下的自定义 tabBar 组件实例是不同的,可通过自定义组件下的 getTabBar 接口,获取当前页面的自定义 tabBar 组件实例。 链接:自定义 tabBar | 微信开放文档

2.2 创建微信小程序项目

项目结构:

2.3 设置app.js代码,添加tabbar页面,并将custom设置为true,app.js代码:
{
"pages":[
"pages/indes/indes",
"pages/patient/main/main",
"pages/patient/my/my",
"pages/doctor/my/my",
"pages/doctor/message/message"
],
"window":{
"backgroundTextStyle":"light",
"navigationBarBackgroundColor": "#fff",
"navigationBarTitleText": "Weixin",
"navigationBarTextStyle":"black"
},
"style": "v2",
"sitemapLocation": "sitemap.json",
"tabBar": {
"custom": true,
"color": "#000000",
"selectedColor": "#000000",
"backgroundColor": "#fffff",
"list": [{
"pagePath": "pages/patient/main/main",
"text": "患者首页",
"iconPath": "/icon/首页 (4).png",
"selectedIconPath": "/icon/首页-copy.png"
}, {
"pagePath": "pages/patient/my/my",
"text": "患者我的",
"iconPath": "/icon/我的 (1).png",
"selectedIconPath": "/icon/我的.png"
},
{
"pagePath": "pages/doctor/my/my",
"text": "医生首页",
"iconPath": "/icon/首页 (1).png",
"selectedIconPath": "/icon/首页.png"
},
{
"pagePath": "pages/doctor/message/message",
"text": "工作日志",
"iconPath": "/icon/医疗档案_medical-files (2).png",
"selectedIconPath": "/icon/医疗档案_medical-files (2).png"
}
]
}
}
2.4 新建custom-tab-bar目录,并在目录下创建Component文件命名为index(官方要求),并依次添加代码

index.js

// custom-tab-bar/index.js
Component({
/**
* 组件的属性列表
  */
  properties: {

},

/**
* 组件的初始数据
  */
  data: {
  allList:[
  [
  {
  "pagePath": "/pages/patient/main/main",
  "text": "患者首页",
  "iconPath": "/icon/首页 (4).png",
  "selectedIconPath": "/icon/首页-copy.png",
  "selected":"00"
  }, {
  "pagePath": "/pages/patient/my/my",
  "text": "患者我的",
  "iconPath": "/icon/我的.png",
  "selectedIconPath": "/icon/我的 (1).png",
  "selected":"01"
  }
  ],
  [
  {
  "pagePath": "/pages/doctor/my/my",
  "text": "医生首页",
  "iconPath": "/icon/首页 (1).png",
  "selectedIconPath": "/icon/首页.png",
  "selected":"02"
  },
  {
  "pagePath": "/pages/doctor/message/message",
  "text": "工作日志",
  "iconPath": "/icon/医疗档案_medical-files (2).png",
  "selectedIconPath": "/icon/医疗档案_medical-files (1).png",
  "selected":"03"
  }

  ]
  ],
  selectList:[],
  },
  /**
* 生命周期的方法:当组件被加载的时候调用
  */
  attached(){
  if(wx.getStorageSync('user')=="01"){
  this.setData({
  selectList:this.data.allList[0]
  })
  }else{
  this.setData({
  selectList:this.data.allList[1]
  })
  }



},
/**
* 组件的方法列表
  */
  methods: {
  swichTo(e){
  //console.dir(e);
  let path=e.currentTarget.dataset.path;
  let selected=e.currentTarget.dataset.selected;

  wx.switchTab({
  url: path,
  })
  }
  }
  })

index.wxml

<!--custom-tab-bar/index.wxml-->
<view class="tab-bar">
  <view class="tab-bar-border"></view>
  <view wx:for="{{selectList}}" wx:key="index" class="tab-bar-item" data-path="{{item.pagePath}}" data-selected="{{item.selected}}" data-index="{{index}}" bindtap="swichTo">
    <image class="cover-image" src="{{selected === item.selected ? item.selectedIconPath : item.iconPath}}"></image>
    <view class="cover-view" style="color: {{selected === item.selected ? selectedColor : color}}">{{item.text}}</view>
  </view>
</view>

index.wxss

/* custom-tab-bar/index.wxss */
.tab-bar {
position: fixed;
bottom: 0;
left: 0;
right: 0;
height: 48px;
background: white;
display: flex;
padding-bottom: env(safe-area-inset-bottom);
}

.tab-bar-border {
background-color: rgba(0, 0, 0, 0.33);
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 1px;
transform: scaleY(0.5);
}

.tab-bar-item {
flex: 1;
text-align: center;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
}

.tab-bar-item .cover-image {
width: 44rpx;
height: 44rpx;
}

.tab-bar-item .cover-view {
margin-top: 8rpx;
font-size: 24rpx;
}
2.5 配置入口文件indes

在indes.js添加goto方法函数:

goto(e){
//  console.dir(e);
//把权限存储缓存当中
wx.setStorageSync('user', e.currentTarget.dataset.type);
if(e.currentTarget.dataset.type=="01"){
wx.switchTab({
url: '../patient/main/main',
})
}else{
wx.switchTab({
url: '../doctor/my/my',
})
}
},

index.wxml

<!--pages/indes/indes.wxml-->
<view class="container">
  <button type="primary" bindtap="goto" data-type="01" style="margin:20rpx;border-radius: 20rpx;">患者登录入口</button>
  <button type="primary" bindtap="goto" data-type="02" style="margin:20rpx;border-radius: 20rpx;">医生登录入口</button>
</view>
2.6 添加每个tabbar界面的.js文件的onShow方法函数(selected: ""的值要特别注意,在index.js中,selected: ""的值对应那个tabbar界面就填入那个tabbar界面的值)
onShow() {
if (typeof this.getTabBar === 'function' &&
this.getTabBar()) {
this.getTabBar().setData({
selected: "00"
})
}
},

配置完成之后就可以运行啦!!!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_62430037

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值