当前位置: 首页 > news >正文

微信小程序-自定义tabBar

通过官网给出的示例自己实现了自定义的tabBar,但结果发现

无法监听页面生命周期函数

结语:原想的是实现不一样的效果(如下)

故尝试了自定义tabBar,虽然做出来了,但也发现这个做法存在不足:

在页面js文件中,需要给出以下代码:

Component({pageLifetimes: {show() {if (typeof this.getTabBar === 'function' &&this.getTabBar()) {this.getTabBar().setData({selected: 0		// 对应tabBar的下标})}}},data: {navBarHeight: getApp().globalData.navBarHeight,},
})

相当于将原来的page页面更改为组件components

这样做的结果就是无法监听页面生命周期函数(至少在创建page时自带的生命周期函数均无法监听)

这是我遇到的,若有解决方案,欢迎留言告知

实现步骤

官方文档:基础能力 / 自定义 tabBar (qq.com)

1.app.json配置tabBar

"tabBar": {"custom": true,"color": "#a5abbd","selectedColor": "#1dba73","backgroundColor": "#ffffff","list": [{"pagePath": "pages/home/home","text": "首页"},{"pagePath": "pages/index/index","text": "测试"}]}

注意:此处path不写最前面的 /

2.在项目根目录下添加文件夹custom-tab-bar,并添加组件,命名为index(下面的代码均借鉴官方demo,可自行修改)

项目文件夹如下:

index.js:

Component({data: {selected: 0,color: "#a5abbd",selectedColor: "#1dba73",list: [{pagePath: "/pages/home/home",iconPath: "/images/icon/home.svg",selectedIconPath: "/images/icon/home-selected.svg",text: "首页"}, {// 此处path必须加前面的/,否则在切换tabbar时,会自动拼接地址,导致传入url有误,系统没有任何效果pagePath: "/pages/index/index",text: "测试"}]},methods: {switchTab(e) {const data = e.currentTarget.datasetconst url = data.path// wx.switchTab切换tabBar组件,可传入url,success,fail,此处简写wx.switchTab({url})// 完整写法// wx.switchTab({//   url: url,//   success(res){console.log(res)},//   fail(error){console.log(error)}// })this.setData({selected: data.index})}}
})

注意:此处path必须加前面的/,否则在切换tabbar时,会自动拼接地址,导致传入url有误,系统没有任何效果

index.json:

{"component": true
}

index.wxml:

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

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 image {width: 27px;height: 27px;
}.tab-bar-item view {font-size: 10px;
}

到此处应该就会出现tabBar且可点击,点击时也能切换页面

但可能出现问题:一个tabBar要点击两次才能更改样式(即tabBar与页面未连接)

解决:

在页面的js文件中:

Component({pageLifetimes: {show() {if (typeof this.getTabBar === 'function' &&this.getTabBar()) {this.getTabBar().setData({selected: 0		// 对应tabBar的下标})}}},data: {navBarHeight: getApp().globalData.navBarHeight,},
})

至此,自定义tabBar便完成了,但就像我前面说的,如此修改之后,无法监听页面的生命周期函数,大家自行判断是否需要自定义tabBar,或者有更好解决方案的,欢迎评论区交流

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 认证中心:基于cookie和session实现单点登陆
  • 【后端开发实习】Python基于Quart框架实现SSE数据传输
  • 科普文:5种Linux下软件部署方式说明
  • 基于微信小程序+SpringBoot+Vue的自习室选座与门禁系统(带1w+文档)
  • git配置代理
  • 深入探索PHP框架:Symfony框架全面解析
  • 将Android Library项目发布到JitPack仓库
  • Android Studio导入源码
  • 使用PageHelper插件来分页查询
  • JavaScript实战 - 一个能够做圆周运动的模型
  • “微软蓝屏”全球宕机,敲响基础软件自主可控警钟
  • HTML:lang属性作用
  • 谷粒商城实战笔记-47-商品服务-API-三级分类-网关统一配置跨域
  • Transformer-Bert---散装知识点---mlm,nsp,较之经典tran的区别和实际应用方式
  • c++中的音乐
  • 收藏网友的 源程序下载网
  • 自己简单写的 事件订阅机制
  • 【附node操作实例】redis简明入门系列—字符串类型
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • ECMAScript入门(七)--Module语法
  • GraphQL学习过程应该是这样的
  • HTTP中GET与POST的区别 99%的错误认识
  • iOS编译提示和导航提示
  • js ES6 求数组的交集,并集,还有差集
  • oldjun 检测网站的经验
  • python学习笔记-类对象的信息
  • RxJS: 简单入门
  • vue-cli在webpack的配置文件探究
  • webpack4 一点通
  • 爱情 北京女病人
  • 安卓应用性能调试和优化经验分享
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 日剧·日综资源集合(建议收藏)
  • 如何解决微信端直接跳WAP端
  • 项目管理碎碎念系列之一:干系人管理
  • 在weex里面使用chart图表
  • ​secrets --- 生成管理密码的安全随机数​
  • ​经​纬​恒​润​二​面​​三​七​互​娱​一​面​​元​象​二​面​
  • #{}和${}的区别?
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (二)正点原子I.MX6ULL u-boot移植
  • (六)vue-router+UI组件库
  • (七)理解angular中的module和injector,即依赖注入
  • (十六)串口UART
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .apk文件,IIS不支持下载解决
  • .FileZilla的使用和主动模式被动模式介绍
  • .NET C# 操作Neo4j图数据库
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .Net Core 微服务之Consul(二)-集群搭建
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置