当前位置:   article > 正文

uni-app 使用 Uview2.x 搭建自定义tabbar组件,自定义navbar,还会解决自定义导航栏引起闪烁性能差的问题!!!_uniapp 自定义导航栏 onload 如果有复杂的计算,会有样式闪烁

uniapp 自定义导航栏 onload 如果有复杂的计算,会有样式闪烁

pages.json

 上面可以看到tabbar我使用的原生的,但是值配置了pagepath,并且page里三个首页都可以自定义顶部导航栏,当然如果删掉custom那一行代码,就切换成原生顶部导航栏了。

下面拿一个首页作为代码演示:(顶部自定义导航栏组件和底部导航栏组件会放在最后)

下图组件没有引入,是使用了easyCom,官网详解

  1. <template>
  2. <div>
  3. <tabbarTop :data="tabbarTopData"></tabbarTop>
  4. <tabbarBottom :current="0"></tabbarBottom>
  5. </div>
  6. </template>
  7. <script>
  8. import { mapState } from 'vuex';
  9. export default {
  10. data() {
  11. return {
  12. tabbarTopData: {
  13. title: "家园首页"
  14. }
  15. }
  16. },
  17. components: {},
  18. computed: {
  19. ...mapState(["hasLogin"])
  20. },
  21. onLoad() {},
  22. onShow() {},
  23. methods: {
  24. }
  25. }
  26. </script>
  27. <style lang="scss" scoped>
  28. </style>

需要在App.vue中onLaunch和onShow方法后面加上uni.hideTabbar({})隐藏原生tabbar(因为兼容性问题两个地方必须都加上)

 特别需要留意的"navigationStyle": "default" 只能控制顶部导航栏是否自定义,而底部导航栏是由下图选项控制,如果要隐藏可以通过   uni.hideTabBar()  隐藏掉,其实就是使用原生的底部导航栏,只不过通过api隐藏掉,然后每个tabbar页面都写上自定义的底部导航栏,

 修改大小
根据需要修改了u-tabbar和u-tabbar-item宽度高度,这些基本属性在uni_modules/uview-ui/components/u-tabbar/u-tabbar.vue和uni_modules/uview-ui/components/u-tabbar-item/u-tabbar-item.vue中都有相应的注释,写得很清楚,自行修改就好

修改u-tabbar的高度,我使用的是深度选择器,只不过需要在自定义底部导航栏组件里面开启一个option,我封装的自定义底部导航栏组件代码如下:

  1. <template>
  2. <div class="tabBox">
  3. <u-tabbar :placeholder="false" :value="current?current:0" @change="tabbarChange" :safeAreaInsetBottom="true" :border="false">
  4. <u-tabbar-item text="首页">
  5. <image class="u-page__item__slot-icon" slot="active-icon" src="@/static/img/橘子.svg">
  6. </image>
  7. <image class="u-page__item__slot-icon" slot="inactive-icon" src="@/static/img/布丁.svg">
  8. </image>
  9. </u-tabbar-item>
  10. <u-tabbar-item text="案例">
  11. <image class="u-page__item__slot-icon" slot="active-icon" src="@/static/img/煎蛋.svg">
  12. </image>
  13. <image class="u-page__item__slot-icon" slot="inactive-icon" src="@/static/img/冰淇淋.svg">
  14. </image>
  15. </u-tabbar-item>
  16. <u-tabbar-item text=" ">
  17. <image class="u-page__item__slot-icon shopTabar" slot="active-icon" src="@/static/img/香蕉.svg">
  18. </image>
  19. <image class="u-page__item__slot-icon" slot="inactive-icon" src="@/static/img/胡萝卜.svg">
  20. </image>
  21. </u-tabbar-item>
  22. <u-tabbar-item text="评测">
  23. <image class="u-page__item__slot-icon" slot="active-icon" src="@/static/img/香蕉.svg">
  24. </image>
  25. <image class="u-page__item__slot-icon" slot="inactive-icon" src="@/static/img/胡萝卜.svg">
  26. </image>
  27. </u-tabbar-item>
  28. <u-tabbar-item text="我的">
  29. <image class="u-page__item__slot-icon" slot="active-icon" src="@/static/img/香蕉.svg">
  30. </image>
  31. <image class="u-page__item__slot-icon" slot="inactive-icon" src="@/static/img/胡萝卜.svg">
  32. </image>
  33. </u-tabbar-item>
  34. </u-tabbar>
  35. </div>
  36. </template>
  37. <script>
  38. export default {
  39. options: { styleIsolation: 'shared' },
  40. data() {
  41. return {
  42. list: [
  43. { path: "pages/home/index" },
  44. { path: "pages/caseStory/index" },
  45. { path: "pages/shop/index" },
  46. { path: "pages/evaluation/index" },
  47. { path: 'pages/user/index' },
  48. ]
  49. }
  50. },
  51. props: {
  52. current: Number
  53. },
  54. components: {},
  55. onLoad() {
  56. },
  57. onShow() {
  58. },
  59. methods: {
  60. tabbarChange(e) {
  61. console.log(e, '/' + this.list[e].path);
  62. uni.switchTab({
  63. url: '/' + this.list[e].path
  64. })
  65. }
  66. }
  67. }
  68. </script>
  69. <style lang="scss" scoped>
  70. .u-page__item__slot-icon {
  71. width: 54rpx;
  72. height: 54rpx;
  73. }
  74. .tabBox {
  75. ::v-deep .u-tabbar__content__item-wrapper {
  76. height: 163rpx;
  77. }
  78. ::v-deep .u-tabbar__content__item-wrapper .u-tabbar-item:nth-child(3) .u-page__item__slot-icon {
  79. width: 102rpx;
  80. height: 102rpx;
  81. }
  82. }
  83. </style>

至于为什么使用option选项:看这篇文章

如果还需要添加底部导航栏按下出现阴影的css效果:参考

自定义导航栏封装的组件:

  1. <template>
  2. <div>
  3. <u-navbar :title="data.title" :safeAreaInsetTop="true" :fixed="true">
  4. <view class="u-nav-slot" slot="left">
  5. <u-icon name="home" size="40"></u-icon>
  6. </view>
  7. </u-navbar>
  8. </div>
  9. </template>
  10. <script>
  11. export default {
  12. data() {
  13. return {
  14. }
  15. },
  16. props: {
  17. data: Object
  18. },
  19. components: {},
  20. onMounted() {
  21. },
  22. onShow() {
  23. },
  24. methods: {
  25. }
  26. }
  27. </script>
  28. <style lang="scss" scoped>
  29. ::v-deep.u-navbar__content__left {
  30. .uicon-home {
  31. font-size: 80rpx !important;
  32. }
  33. }
  34. </style>

后续产品让把tabbar设置成五个,中间的一个设置为圆的并且突出显示,如下图:

只需要在上面封装的tabbar代码里面用深度选择器改一下第三个item:

 

还有一种方案 切换tabbar的时候并未跳转页面,而是把tabbar页面分别封装成了组件 在切换组件。(豌豆拼车小程序 貌似就是这种) 

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