微信小程序自定义tabBar在uni-app的适配详解


Posted in Javascript onSeptember 30, 2019
引言:此方法可用作大部分微信小程序支持,但uni-app文档中却找不到相关说明的API

需求

需要在微信小程序中,实现一个中间图标突出显示的异形导航栏。

如下图

微信小程序自定义tabBar在uni-app的适配详解

实现方法设计

要做这种异形的导航栏,用直接在配置文件里面写list的方法肯定做不到。那么,就有以下两种可替代方法。

  1. 在每一个页面都加载一个tabBar组件,与页面同时渲染。
  2. 设置自定义tabBar,修改tabBar的样式。

优缺点分析:方法1实现起来略为简单,但是会出现代码可重用率低,降低性能,已经界面跳动等问题。方法2则是微信官方提供的,自定义方式,相信在性能方面也会有很大的优势。故选择方法2。

1. 查看文档及官方Demo

官方文档

简要描述一下就是需要在根目录中加入一个custom-tab-bar目录,里面的文件结构与自定义组件的结构一致。然后再在小程序配置文件中修改tabbar为custom模式。

官方代码

主要重点为三个部分

配置文件

微信小程序自定义tabBar在uni-app的适配详解

custom-tab-bar目录

微信小程序自定义tabBar在uni-app的适配详解

页面生命周期中的设置索引方法

微信小程序自定义tabBar在uni-app的适配详解

这段代码其实很容易理解,pageLifetimes就是监听组件所在页面的生命周期。上述代码就是监听页面显示。当页面显示后,获取到tabBar的对象,然后再设置tabBar中的index索引。

2. 迁移到uni-app框架

上面的方法是使用微信小程序的开发方式,而我使用的是uni-app框架开发微信小程序的。所以我们需要把它们移植到uni-app框架内。

配置文件的修改

uni-app中,page.json被编译为微信小程序的app.json。所以,我们直接修改page.json

微信小程序自定义tabBar在uni-app的适配详解

custom-tab-bar目录的适配

我们知道,uni-app使用的是类Vue开发,将一个Vue文件编译为四个微信页面文件(wxml,wxss,json,js)。那么,是否可以直接写一个custom-tab-bar.vue的文件呢?刚开始我也是这么想的,后来发现uni-app只会编译page目录和component目录下的vue文件。而微信小程序要求custom-tab-bar必须在项目的根目录下。那么就只能在uni-app下创建一个custom-tab-bar目录,并老老实实写微信四件套了。

微信小程序自定义tabBar在uni-app的适配详解

写完后,uni-app会将该目录完美的复制至微信小程序项目的根目录。

tab页面内的适配方法

这个在我实际开发中,是最令我头痛的了。因为微信小程序的this引用与uni-app的this引用并不相同。所以如果直接复制代码是会编译出错的。而另一个问题则是,uni-app并未提供pageLifetimes的事件监听。

在我经过一番摸索之后,发现将设置索引方法写在onShow事件里面,效果是等效的。接下来便只剩下this的问题了。

如果直接复制的话,会出现无任何效果的情况

微信小程序自定义tabBar在uni-app的适配详解

因为uni-app的this引用不一样,所以它在判断getTabBar的时候,获取的是“undefined”所以不会执行下面的操作。如果你将判断去掉,则会直接报“undefined”错误。

难道实现不了?其实不然,万变不离其宗。uni-app也是编译到小程序的,所以绝对有迹可循。

我们首先看看uni-app里面this的内容。

微信小程序自定义tabBar在uni-app的适配详解

我们可以很明显的看到里面有个$mp的对象,说明这应该是微信小程序专用的对象。接下来我们继续分析$mp

微信小程序自定义tabBar在uni-app的适配详解

这里面有一个隐藏很深的getTabBar方法,我们直接调用它,和在微信小程序里面调用this.getTabBar是等效的。

所以我们就可以把onShow里面的内容写成这样。

微信小程序自定义tabBar在uni-app的适配详解

一些优雅点的封装

设置索引方法独立出来

在methods对象中,添加

setTabBarIndex(index){
      if (typeof this.$mp.page.getTabBar === 'function' &&
        this.$mp.page.getTabBar()) {
        this.$mp.page.getTabBar().setData({
          selected:index
        })
      }
    }

使用mixin避免重复书写复制

main.js中,添加

Vue.mixin({
  methods:{
    setTabBarIndex(index){
      if (typeof this.$mp.page.getTabBar === 'function' &&
        this.$mp.page.getTabBar()) {
        this.$mp.page.getTabBar().setData({
          selected:index
        })
      }
    }
  }
})

混入后的使用

在页面文件中

onShow() {
      this.setTabBarIndex(0) //index为当前tab的索引
    }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript Jquery 遍历Json的实现代码
Mar 31 Javascript
JavaScript中的对象的extensible属性介绍
Dec 30 Javascript
javascript+canvas实现刮刮卡抽奖效果
Jul 29 Javascript
js实现对ajax请求面向对象的封装
Jan 08 Javascript
如何消除inline-block属性带来的标签间间隙
Mar 31 Javascript
纯JS前端实现分页代码
Jun 21 Javascript
webpack+vue-cli项目中引入外部非模块格式js的方法
Sep 28 Javascript
Vue加载json文件的方法简单示例
Jan 28 Javascript
JavaScript中this的全面解析及常见实例
May 14 Javascript
转换layUI的数据表格中的日期格式方法
Sep 19 Javascript
小程序实现背景音乐播放和暂停
Jun 19 Javascript
vue 获取url参数、get参数返回数组的操作
Nov 12 Javascript
详解小程序云开发攻略(解决最棘手的问题)
Sep 30 #Javascript
webpack3升级到webpack4遇到问题总结
Sep 30 #Javascript
uploadify插件实现多个图片上传并预览
Sep 30 #Javascript
vue中使用[provide/inject]实现页面reload的方法
Sep 30 #Javascript
JavaScript中的null和undefined用法解析
Sep 30 #Javascript
vue resource发送请求的几种方式
Sep 30 #Javascript
Bootstrap table 实现树形表格联动选中联动取消功能
Sep 30 #Javascript
You might like
用PHP实现浏览器点击下载TXT文档的方法详解
2013/06/02 PHP
Mac系统下使用brew搭建PHP(LNMP/LAMP)开发环境
2015/03/03 PHP
php+ajax 文件上传代码实例
2019/03/18 PHP
Laravel框架处理用户的请求操作详解
2019/12/20 PHP
jQuery的实现原理的模拟代码 -1 核心部分
2010/08/01 Javascript
IE和Firefox的Javascript兼容性总结[推荐收藏]
2011/10/19 Javascript
使用js声明数组,对象在jsp页面中(获得ajax得到json数据)
2013/11/05 Javascript
javascript 获取网页标题代码实例
2014/01/22 Javascript
jQuery中prepend()方法使用详解
2015/08/11 Javascript
JS获取鼠标坐标位置实例分析
2016/01/20 Javascript
基于jQuery Ajax实现上传文件
2016/03/24 Javascript
bootstrap输入框组代码分享
2016/06/07 Javascript
轻松5句话解决JavaScript的作用域
2016/07/15 Javascript
jQuery弹出遮罩层效果完整示例
2016/09/13 Javascript
微信小程序实现收藏与取消收藏切换图片功能
2018/08/03 Javascript
Vue-CLI 项目在pycharm中配置方法
2019/08/30 Javascript
浅析vue cli3 封装Svgicon组件正确姿势(推荐)
2020/04/27 Javascript
js 动态校验开始结束时间的实现代码
2020/05/25 Javascript
javascript的hashCode函数实现代码小结
2020/08/11 Javascript
vue中解决chrome浏览器自动播放音频和MP3语音打包到线上的实现方法
2020/10/09 Javascript
Pycharm之快速定位到某行快捷键的方法
2019/01/20 Python
对django2.0 关联表的必填on_delete参数的含义解析
2019/08/09 Python
Python 字符串类型列表转换成真正列表类型过程解析
2019/08/26 Python
python自动化UI工具发送QQ消息的实例
2019/08/27 Python
Python Numpy 自然数填充数组的实现
2019/11/28 Python
Pytorch之保存读取模型实例
2019/12/30 Python
pycharm中导入模块错误时提示Try to run this command from the system terminal
2020/03/26 Python
vscode+PyQt5安装详解步骤
2020/08/12 Python
pytorch使用horovod多gpu训练的实现
2020/09/09 Python
解析浏览器的一些“滚动”行为鉴赏
2019/09/16 HTML / CSS
EGO Shoes美国/加拿大:英国时髦鞋类品牌
2018/08/04 全球购物
农业资源与环境专业自荐信范文
2013/12/30 职场文书
运动会广播稿20字
2014/02/18 职场文书
学生会竞选演讲稿学习部
2014/08/25 职场文书
雷峰塔导游词
2015/02/09 职场文书
JPA 通过Specification如何实现复杂查询
2021/11/23 Java/Android