微信小程序自定义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制作的可折叠弹出式菜单示例
Apr 04 Javascript
绑定回车enter事件代码
May 18 Javascript
JavaScript中操作字符串小结
May 04 Javascript
jQuery往返城市和日期查询实例讲解
Oct 09 Javascript
jQuery实现的超链接提示效果示例【附demo源码下载】
Sep 09 Javascript
微信小程序 页面之间传参实例详解
Jan 13 Javascript
基于JavaScript实现淘宝商品广告效果
Aug 10 Javascript
Vue自定义全局Toast和Loading的实例详解
Apr 18 Javascript
简述pm2常用命令集合及配置文件说明
May 30 Javascript
微信小程序swiper左右扩展各显示一半代码实例
Dec 05 Javascript
vue中使用elementUI组件手动上传图片功能
Dec 13 Javascript
微信小程序实现点击导航条切换页面
Nov 19 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代码
2012/06/08 PHP
关于Zend Studio 配色方案插件的介绍
2013/06/24 PHP
PHP数组函数知识汇总
2016/05/12 PHP
thinkphp中的多表关联查询的实例详解
2017/10/12 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
2017/11/10 PHP
js转义字符介绍
2013/11/05 Javascript
JS小功能(button选择颜色)简单实例
2013/11/29 Javascript
实现网页页面跳转的几种方法(meta标签、js实现、php实现)
2014/05/20 Javascript
浅谈Javascript中匀速运动的停止条件
2014/12/19 Javascript
JavaScript组件开发之输入框加候选框
2017/03/10 Javascript
详解在vue-cli项目中使用mockjs(请求数据删除数据)
2017/10/23 Javascript
关于react-router/react-router-dom v4 history不能访问问题的解决
2018/01/08 Javascript
结合Vue控制字符和字节的显示个数的示例
2018/05/17 Javascript
Seajs源码详解分析
2019/04/02 Javascript
JS操作json对象key、value的常用方法分析
2019/10/29 Javascript
详解JavaScript作用域 闭包
2020/07/29 Javascript
全网小程序接口请求封装实例代码
2020/11/06 Javascript
[06:38]DOTA2怒掀电竞风暴 2013Chinajoy
2013/07/27 DOTA
[01:01:52]完美世界DOTA2联赛PWL S2 GXR vs Magma 第二场 11.25
2020/11/26 DOTA
Python编程实现微信企业号文本消息推送功能示例
2017/08/21 Python
Python读取文件内容的三种常用方式及效率比较
2017/10/07 Python
Python读取本地文件并解析网页元素的方法
2018/05/21 Python
详解opencv Python特征检测及K-最近邻匹配
2019/01/21 Python
Python3实现的判断环形链表算法示例
2019/03/07 Python
在PYQT5中QscrollArea(滚动条)的使用方法
2019/06/14 Python
tensorflow 实现打印pb模型的所有节点
2020/01/23 Python
python logging 日志的级别调整方式
2020/02/21 Python
学习党的群众路线教育实践活动心得体会
2014/03/01 职场文书
卫校毕业生个人自我鉴定
2014/04/28 职场文书
励志演讲稿3分钟
2014/08/21 职场文书
学生犯错保证书
2015/05/09 职场文书
2015年电厂工作总结范文
2015/05/13 职场文书
springboot+WebMagic+MyBatis爬虫框架的使用
2021/08/07 Java/Android
win10频率超出范围怎么办?win10老显示超出工作频率范围的解决方法
2022/07/07 数码科技
LyScript实现绕过反调试保护的示例详解
2022/08/14 Python
HTML 里 img 元素的 src 和 srcset 属性的区别详解
2023/05/21 HTML / CSS