uniapp底部自定义tabbar遇到的问题

文章介绍了如何在使用uni_modules的niceui-tabBar组件时,正确地实现底部导航栏的页面切换,指出用redirectTo会导致页面关闭,应改用switchTab方法。作者提供了相应的代码示例和问题解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用这个组件自定义tabbar 

源代码:

<template>  
  <view>  
        <view>首页</view>
        <custom-tab-bar :items="tabItems" :currentIndex="currentTab" @item-click="onTabClick"
        :color="color" :selectedColor="selectedColor"></custom-tab-bar>
  </view>  
</template>  

<script>  
import CustomTabBar from '@/uni_modules/niceui-tabBar/components/niceui-tabBar/niceui-tabBar.vue';  
import tabbar from '@/uni_modules/niceui-tabBar/common/tabbar.js'
export default {  
  components: {  
    CustomTabBar  
  },  
  data() {  
    return {  
        currentTab: 0, // 当前选中的tab索引  
        tabItems:tabbar.tabItems,
        color:tabbar.color,
        selectedColor:tabbar.selectedColor
    }
  },
  methods: {  
     onTabClick(index) { // 切换tab的函数,当选中某个tab时触发  
       //this.currentTab = index;  
       if(index!=this.currentTab){
            uni.redirectTo({
                url:this.tabItems[index].pagePath
            })
       }
     }  
   }  
};  
</script>
//pagePath以自己项目的实际路径为准,这里是为了代码聚合在一起
const tabbar = {
    "tabItems":[
        {
            "pagePath": "/uni_modules/niceui-tabBar/pages/index/index",
            "icon": '/static/images/tabbar/index.png', 
            "selectedIcon":'/static/images/tabbar/index-action.png', 
            "text": '首页',
        },
        {
            "pagePath": "/uni_modules/niceui-tabBar/pages/add/add",
            "icon": '/static/images/tabbar/add.png', 
            "selectedIcon":'/static/images/tabbar/add-action.png', 
            "text": '新建',
            "up":true
        },
        { 
            "pagePath": "/uni_modules/niceui-tabBar/pages/user/user",
            "icon": '/static/images/tabbar/me.png', 
            "selectedIcon":'/static/images/tabbar/me-action.png', 
            "text": '我的',
        }
    ],
    "color":"#333",
    "selectedColor":"green",
}
export default tabbar

跳转报错

解决:

问题是用的redirectTo跳转,redirectTo可以在当前页面跳转到指定的目标页面,当前页面会被关闭,并跳转到指定的目标页面。 

而我们是底部导航栏页面切换,应该用switchTab

### UniApp自定义 Bottom TabBar 闪烁解决方案 在 UniApp 开发过程中,当实现自定义底部 TabBar 功能时,可能会遇到页面切换或加载期间出现的短暂闪烁现象。这种问题通常由以下几个原因引起: #### 原因分析 1. **原生 tabBar 的显示与隐藏冲突** 当应用启动时,默认会显示系统的原生 tabBar,在未完全初始化自定义 tabBar 组件之前,两者可能同时存在一段时间,从而造成视觉上的闪烁效果[^1]。 2. **缓存数据同步延迟** 使用 `uni.setStorageSync` 或 `uni.getStorageSync` 存储当前选中的 tabBar 下标时,如果读取和写入操作未能及时完成,则可能导致界面状态不一致,进而引发闪烁。 3. **生命周期管理不当** 如果在 App 启动阶段 (`onLaunch`) 和页面跳转事件中没有合理控制逻辑顺序,也可能导致渲染异常。 --- #### 解决方案 以下是针对上述问题的具体优化措施: ##### 方法一:提前隐藏原生 tabBar 并设置初始状态 通过在 `App.vue` 文件中调用 `uni.hideTabBar()` 隐藏默认的 tabBar,并清除存储的选择索引值来避免不必要的干扰。 ```javascript // App.vue export default { onLaunch: function () { console.log('App Launch'); uni.hideTabBar(); // 隐藏原生 tabBar uni.removeStorageSync('selectedIndex'); // 清除已保存的下标 } } ``` 此方法可以有效防止系统自带 tabBar 被临时展示出来而引起的闪屏情况发生。 --- ##### 方法二:动态加载自定义 tabBar 组件 创建一个新的组件作为自定义 tabBar 来替代原有的功能模块。为了减少首次渲染时间带来的影响,可以在根目录下的全局配置文件里指定该组件路径并启用懒加载机制。 例如: ```json { "usingComponents": true, "pages": [ ... ], "tabBar": { "custom": true, // 设置为 custom 表示开启自定义模式 "list": [] // 此处无需填写具体项因为我们将单独处理它们 }, "lazyCodeLoading": "requiredModules" } ``` 接着编写对应的 HTML 结构以及样式规则如下所示: ```html <!-- components/custom-tab-bar/index.wxml --> <view class="tab-bar"> <block wx:for="{{tabs}}" wx:key="pagePath"> <navigator url="{{item.pagePath}}"> <image src="{{selected === index ? item.selectedIconPath : item.iconPath}}"></image> <text>{{item.text}}</text> </navigator> </block> </view> ``` 配合 CSS 完成布局调整即可获得更加流畅自然的效果体验。 --- ##### 方法三:利用条件渲染技术屏蔽过渡期画面 对于某些特殊场景而言,仅依靠单纯地关闭原始控件或许仍然无法彻底消除残留影像。此时可以通过增加额外的状态变量来进行判断,只有当所有准备工作都完成后才会真正显示出最终版本的内容区域。 修改后的 JavaScript 如下: ```javascript data() { return { isReady: false, // 控制是否允许呈现主视图标志位 tabs: [], // 自定义导航栏列表数组对象集合 selected: 0 // 默认激活位置编号零号元素对应首页链接地址 }; }, methods: { initCustomTabBar() { this.tabs = [{ pagePath: "/pages/home/home", iconPath: "./assets/icons/home.png", selectedIconPath: "./assets/icons/home-active.png", text: "Home" }, { pagePath: "/pages/cart/cart", iconPath: "./assets/icons/cart.png", selectedIconPath: "./assets/icons/cart-active.png", text: "Cart" } ]; const selectedIndex = uni.getStorageSync('selectedIndex') || 0; this.setData({ selected: parseInt(selectedIndex), isReady: true // 初始化完毕标记设为真以便后续正常运作流程继续推进下去 }); } }, onLoad() { this.initCustomTabBar(); } ``` 最后记得更新模板部分使其支持基于布尔型属性驱动的行为表现形式变化过程描述清楚一点比较好理解一些哦~ 😊 ```html <view hidden="{{!isReady}}"> <!-- 主体内容区 --> </view> <view class="custom-tab-bar" hidden="{{isReady}}"> {{/* 这里放置占位符或其他提示信息直到实际可用为止 */}} </view> ``` 以上三种方式结合起来能够很好地应对大多数情况下由于各种因素共同作用所造成的底边菜单频繁抖动或者突然消失重现等问题的发生概率大大降低甚至完全可以忽略不计的程度上去了呢😊! --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值