当前位置:   article > 正文

uniapp 开发小程序之实现不同身份展示不同的 tabbar(底部导航栏),附带相关问题解答_uniapp + uview 小程序 动态导航

uniapp + uview 小程序 动态导航

效果展示:

 

引言

在开发过程中逐渐意识到uniapp原生的tabbar可能不能满足开发要求,通过浏览博客才选择使用uView的Tabbar 底部导航栏来实现,我选择用的是2X版本

安装

我是使用Hbuilder插件的方式引入的组件库,安装配置可以看这篇:

下载安装方式配置 | uView 2.0 - 全面兼容nvue的uni-app生态框架 - uni-app UI框架

插件市场:

uView2.0重磅发布,利剑出鞘,一统江湖 - DCloud 插件市场

现在就开始现实需求

  • 首先在pages.json中定义文件路径:
  1. "pages": [{
  2. "path": "pages/xxx/xxx",
  3. "style": {
  4. "navigationBarTitleText": "",
  5. "enablePullDownRefresh": false
  6. }
  7. },
  8. {
  9. //消息
  10. "path": "pages/xxx/xxx"
  11. },
  12. {
  13. "path": "pages/xxx/xxx",
  14. "style": {
  15. "navigationBarTitleText": "xxxx"
  16. }
  17. },
  18. {
  19. "path": "pages/xxx/xxx",
  20. "style": {
  21. "navigationBarTitleText": "",
  22. "enablePullDownRefresh": false
  23. }
  24. },
  25. {
  26. xxxxxxxxxxxxxxxxxxxxxx
  27. }]
  1. "tabBar": {
  2. "height":"1px",
  3. // 配置选中颜色
  4. "selectedColor": "#22bf8e",
  5. "color": "#f8f8f8", // 设置为与背景颜色相同
  6. "backgroundColor": "transparent", // 设置为透明
  7. // list 每一项
  8. "list": [{
  9. "pagePath": "pages/xxx/xxx"
  10. },
  11. {
  12. "pagePath": "pages/xxx/xxx"
  13. },
  14. {
  15. "pagePath": "pages/xxx/xxx"
  16. },
  17. {
  18. "pagePath": "pages/xxx/xxx"
  19. },
  20. {
  21. "pagePath": "xxxxxxxxxxxxxx"
  22. }
  23. ]
  24. }

配置pages.josn中tabBar的原因:是因为要根据uni.switchTab来跳转页面,而uni.switchTab能够跳转是需要在tabBar中定义pagePath的

tabbar底部栏过多怎么办:pages.josn中tabBar最多只能定义五个,如果超出就不能使用uni.switchTab跳转了,需要用uni.navigateTo跳转,不过这两种跳转的效果是不同的,具体需要按照实际情况

  • 然后定义一个tabbar.js
  1. //身份一
  2. let tab1 = [{
  3. "text": "消息",
  4. "pagePath": "pages/xxx/xxx",
  5. "iconPath": "../static/xxx/xxx",
  6. "selectedIconPath": "../static/xxx/xxx"
  7. },
  8. {
  9. "text": "消息",
  10. "pagePath": "pages/xxx/xxx",
  11. "iconPath": "../static/xxx/xxx",
  12. "selectedIconPath": "../static/xxx/xxx"
  13. },
  14. {
  15. "text": "消息",
  16. "pagePath": "pages/xxx/xxx",
  17. "iconPath": "../static/xxx/xxx",
  18. "selectedIconPath": "../static/xxx/xxx"
  19. },
  20. {
  21. "text": "消息",
  22. "pagePath": "pages/xxx/xxx",
  23. "iconPath": "../static/xxx/xxx",
  24. "selectedIconPath": "../static/xxx/xxx"
  25. }
  26. ]
  27. // 身份二
  28. let tab2 = [{
  29. "text": "消息",
  30. "pagePath": "pages/xxx/xxx",
  31. "iconPath": "../static/xxx/xxx",
  32. "selectedIconPath": "../static/xxx/xxx"
  33. },
  34. {
  35. "text": "消息",
  36. "pagePath": "pages/xxx/xxx",
  37. "iconPath": "../static/xxx/xxx",
  38. "selectedIconPath": "../static/xxx/xxx"
  39. },
  40. {
  41. "text": "消息",
  42. "pagePath": "pages/xxx/xxx",
  43. "iconPath": "../static/xxx/xxx",
  44. "selectedIconPath": "../static/xxx/xxx"
  45. },
  46. {
  47. "text": "消息",
  48. "pagePath": "pages/xxx/xxx",
  49. "iconPath": "../static/xxx/xxx",
  50. "selectedIconPath": "../static/xxx/xxx"
  51. }
  52. ]
  53. export default [
  54. tab1,
  55. tab2
  56. ]
  • 然后在app.vue中登录,根据身份进行判断赋值,localStorage.set()我是封装的uni.setStorageSync方法
  1. import tabBar from '@/utils/tabbar.js'
  2. if(xxxx){
  3. localStorage.set('tabBar', tabBar[0])
  4. }else if(xxx){
  5. localStorage.set('tabBar', tabBar[1])
  6. }
  • 然后在app.vue中隐藏掉原生tabbar
  1. onLaunch: function() {
  2. uni.hideTabBar()
  3. console.log('App onLaunch')
  4. },
  5. onShow: function() {
  6. uni.hideTabBar()
  7. console.log('App Show')
  8. }
  • 然后定义一个tabbar组件
  1. <template>
  2. <view>
  3. <u-tabbar class="tabbar-ios-fix" activeColor='#22bf8e' :value="current?current:0" :fixed="true"
  4. :placeholder="true" :safeAreaInsetBottom="true" @change="handleTabClick">
  5. <u-tabbar-item v-for='(item,index) in tabList' :key="index" :text="item.text">
  6. <image slot="inactive-icon" class="u-page__item__slot-icon" :src="item.iconPath">
  7. </image>
  8. <image slot="active-icon" class="u-page__item__slot-icon" :src="item.selectedIconPath">
  9. </image>
  10. </u-tabbar-item>
  11. </u-tabbar>
  12. </view>
  13. </template>
  14. <script>
  15. import localStorage from '@/utils/localStorage.js'
  16. export default {
  17. props: {
  18. current: Number
  19. },
  20. data() {
  21. return {
  22. tabList: localStorage.get('tabBar')
  23. };
  24. },
  25. mounted() {
  26. console.log(this.tabList)
  27. },
  28. methods: {
  29. handleTabClick(index) {
  30. console.log(index)
  31. if (index >= 3) {
  32. console.log('切换到我的')
  33. switch (index) {
  34. case 3:
  35. uni.navigateTo({
  36. url: '/pages/mine/mine',
  37. });
  38. break;
  39. }
  40. return
  41. }
  42. // 使用 uni.switchTab 方法切换页面
  43. uni.switchTab({
  44. url: '/' + this.tabList[index].pagePath,
  45. });
  46. },
  47. }
  48. }
  49. </script>
  50. <style lang="scss">
  51. .u-page__item__slot-icon {
  52. width: 50rpx;
  53. height: 50rpx;
  54. }
  55. .tabbar-ios-fix {
  56. bottom: calc(120rpx + env(safe-area-inset-bottom));
  57. }
  58. </style>

u-tabbar解惑:

一、如需要自定义图标/颜色,在u-tabbar-item标签中使用插槽active-iconinactive-icon来定义图标和颜色

二、可以通过.u-page__item__slot-icon修改图标大小

三、不在pages.josn中定义list,可通过switch判断,用uni.navigateTo跳转

四、其他属性可查看官网:

Tabbar 底部导航栏 | uView 2.0 - 全面兼容nvue的uni-app生态框架 - uni-app UI框架

  • 然后开始使用tabbar组件 ,正常引用、注册、使用就行
  1. <tabbar :current="0"></tabbar>
  2. import tabbar from "@/components/tabbar.vue"
  3. export default {
  4. components: {
  5. tabbar
  6. }
  7. }

注意:哪里需要底部栏,就在哪几个页面引入、注册、使用


其中遇到一个机型问题,苹果手机预览,底部还是会出现一段白底,如何解决?

其实也很简单,在每个使用了tabbar组件的页面中也单独定义隐藏原生tabbar的方法,如下代码

  1. onLoad() {
  2. uni.hideTabBar()
  3. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/76938
推荐阅读