微信小程序开发自定义tabBar实战案例(定制消息99+小红心)

 更新时间:2022年12月08日 14:56:46   作者:计算机魔术师  
一定的需求情况下无法使用小程序原生的tabbar的时候,需要自行实现一个和tabbar功能一模一样的自制组件,下面这篇文章主要给大家介绍了关于微信小程序开发自定义tabBar(定制消息99+小红心)的相关资料,需要的朋友可以参考下

一、前提概要

效果:实现一个自定义tabBar,使消息tabBar能够显示消息数量,并通过全局共享的方式,控制消息数量

需要的知识点如下:

  • mobx辅助库(全局共享,见文章)
  • vant组件库(见文章)
  • 组件的behavior (见文章)
  • 自定义组件
  • 样式隔离
  • 组件数据监听器

自定义组件主要分为三个步骤(许多实例实现步骤差不多流程)

  • 配置信息 (几乎每个要实现的都需要这一步)
  • 创建自定义组件代码文件
  • 编写代码
  • 详细步骤参考官方文档

注意:在配置自定义tabBar时,app.json中节点list不能删除,因为仍需要指定tabBar页面,这是tabBar的必要配置,但是这些字段不会影响自定义渲染。(如果低版本不生效,默认读取该字段渲染)

官方文档如是说

和默认tabBar一样,在app.json 中仅需要在tabBar节点设置( custom = true 设置为自定义),然后需要添加代码文件,

代码文件

custom-tab-bar/index.js
custom-tab-bar/index.json
custom-tab-bar/index.wxss
custom-tab-bar/index.wxml

我们创建根目录下custom-tab-bar文件,点击生成component(将其作为组件自定义,这与页面导航自定义是一样原理的)

效果如图:

此时系统自动识别该文件

接下来使用vant-weapp的组件库,对vant-weapp组件不了解的,

我们引入vant的tabBar标签组件

vant-weapp官方文档引入tabBar标签

复制代码,放入index.json文件中的components节点中(局部引入)

"usingComponents": {
  "van-tabbar": "@vant/weapp/tabbar/index",
  "van-tabbar-item": "@vant/weapp/tabbar-item/index"
}

按照官方文档,配置js文件的数据和方法,即可基本使用

效果:

接下来我们自定义图标,见官方文档:

还记得slot的用法吗,插槽

在对应的tabbar-item项中直接放入图片,通过插槽slot指定图片是选中状态还是未选中状态
在vant的tabbar组件源代码其实是有对于两个插槽接受图片的,如下:

<slot name="icon"></slot>
<slot name="icon-active"></slot>

源代码

<van-tabbar active="{{ active }}" bind:change="onChange">
  <van-tabbar-item info="3">
    <image
      slot="icon"
      src="{{ icon.normal }}"
      mode="aspectFit"
      style="width: 30px; height: 18px;"
    />
    <image
      slot="icon-active"
      src="{{ icon.active }}"
      mode="aspectFit"
      style="width: 30px; height: 18px;"
    />
    自定义
  </van-tabbar-item>
  <van-tabbar-item icon="search">标签</van-tabbar-item>
  <van-tabbar-item icon="setting-o">标签</van-tabbar-item>
</van-tabbar>
Page({
  data: {
    active: 0,
    icon: {
      normal: 'https://img.yzcdn.cn/vant/user-inactive.png',
      active: 'https://img.yzcdn.cn/vant/user-active.png',
    },
  },
  onChange(event) {
    this.setData({ active: event.detail });
  },
});

我们往image标签的属性src放置我们图标即可

没有好的图标素材见:图标库素材

效果:


其中info是对改组件的传参,可以动态设定,不需要删掉即可

接下来我们循环生成图标,将我们第一个实例配置tabbarlist节点复制到index.jsdata中,组件通过wx:for循环list数组,生成对应图标,

效果:

图片样式可以自己定义style

设置info的值可以在图标上显示 ,但是我们发现改图标会超出范围,如下图

原因很简单,是vant组件样式下有一个margin-bottom导致,我们可以通过设置vant组件的css全局变量设置

在通过外部样式修改组件的内部样式(样式隔离)之前,我们需要设定样式隔离

“styleIsolation”: "shared"

在父组件配置,修改配置

在index.js中

Component({
	"options":{
	"styleIsolation": "shared"
	}

二、 动态显示info消息

如果未定义info则为假,不显示,如果为0也为假,也不显示符合我们的开发需求

使用mobx全局共享

思路:mobx绑定全局控制info

mobx官方文档

在index.js如下配置

// custom-tab-bar/index.js
import { storeBindingsBehavior } from 'mobx-miniprogram-bindings' //引入创建绑定实例
import { store } from '../store/store' // 引入仓库store
Component({
	behaviors:[storeBindingsBehavior],
	storeBindingsBehavior:[{
		store,
		fields:{
		sum: 'sum'
		},
		actions:{
		}

绑定sum的值到info

在一开始我是不知道如何同步sum和info的值,甚至想用 组件通信的知识解决(大家都知道组件通信很麻烦),
但是忘了组件有一个非常的方法:数据监听器 (behavior)

a
代码解释:
在以往赋值时是不需要对赋值对象加上双引号“”的,
但是 list需要索引到 list[1] 由于模板语法需要双引号的形式 'list[1].info' : a

效果如下

三、 页面切换效果

通过改组件自带的 事件绑定函数 onChange解决 (通过其active的变化使用编程式导航(文章介绍更新中)索引listurl路径切换页面

代码部分

methods: {
	onChange(event) {
		// event.detail 的值为当前选中项的索引 
		this.setData({
			active: event.detail
		});
		wx.switchTab({
			url: String(this.data.list[event.detail].pagePath), // String转换为字符串 或者加 "" 隐式转换, - 0 则隐式转换为整数
		})
	},

但是在设定好之后会出现如下情况,页面有正常跳转,但是图标却出了bug,其中active在组件中是控制跳转到哪一个页面的,为0跳转到一个,为1跳转到第二个 ,在调试中,我发现active的值没有毛病,按道理不应该出bug,所以笔者认为应该是页面跳转时候,组件中的active会变化,而js文件的active没问题

解决方法:
将active 存贮到store 进行全局共享

添加字段和方法

在index.js文件中 修改onChnage函数

methods: {
	onChange(event) {
		// event.detail 的值为当前选中项的索引 
		this.updataActive(event.detail)
		wx.switchTab({
			url: String(this.data.list[event.detail].pagePath), // String转换为字符串 或者加 "" 隐式转换, - 0 则隐式转换为int
		})
	},

效果:

实现成功

修改标签颜色值

官方文档找到API

效果图:

四、 配置总结

其实我们都需要配置好tabBar的,不管是不是自定义都需要在app.jsontarBar节点配置,我们可以自定义配置文件可以tarBar节点配置好完整属性,查看效果在细调,然后我们在创建自定义文件,编写代码,然后将我们刚刚配置的list节点放入 custom-tab-barindex.jsdata中在index.wxml通过循环遍历改list数据实现效果,这种流程有几个好处

  1. 在版本不兼容时等一些特殊情况,还是能基本显示效果,
  2. 不用同时两处配置,在app.json节点配置list复制到index.jsdata,通过页面循环即可实现,且所循环数据都能很好满足数据需求,如图像链接,文本等

到此这篇关于微信小程序开发自定义tabBar的文章就介绍到这了,更多相关微信小程序自定义tabBar内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • js中编码函数:escape,encodeURI与encodeURIComponent详解

    js中编码函数:escape,encodeURI与encodeURIComponent详解

    escape(), encodeURI()和encodeURIComponent()是在Javascript中用于编码字符串的三个常用的方法,而他们之间的异同却困扰了很多的Javascript初学者,这篇文章详细的给大家介绍了js中编码函数:escape,encodeURI与encodeURIComponent的相关资料,需要的朋友可以参考下。
    2017-03-03
  • 网站页面自动跳转实现方法PHP、JSP(下)

    网站页面自动跳转实现方法PHP、JSP(下)

    很多时候我们需要Web页具备有自动跳转功能,例如,论坛中的用户登录、发帖及回复或留言簿中的留言和回复等操作成功后,若用户没有任何鼠标点击操作,过了一定的时间,页面自动跳转到预设的页面。
    2010-08-08
  • 幻宇的层模拟窗口效果-提供演示和下载

    幻宇的层模拟窗口效果-提供演示和下载

    幻宇的层模拟窗口效果-提供演示和下载...
    2007-01-01
  • javascript数组排序汇总

    javascript数组排序汇总

    本文给大家汇总了一下javascript的数组排序算法,包括冒泡排序、快速排序、插入排序、希尔排序,希望对大家熟悉javascript数组排序能够有所帮助。
    2015-07-07
  • js实现下载(文件流式)方法详解与完整实例源码

    js实现下载(文件流式)方法详解与完整实例源码

    这篇文章主要介绍了js实现下载(文件流式)的方法,需要的朋友可以参考下
    2022-12-12
  • 初识javascript 文档碎片

    初识javascript 文档碎片

    今天遇到一个问题: 我通过 ajax 取回另一个页面的 Html 。但这些 HTML 我不想直接输出,想通过 getElementsByName 处理后再输出相应的内容。用原生的 javascript怎样可以处理呢?
    2010-07-07
  • 在js代码拼接dom对象到页面上去的模板总结(必看)

    在js代码拼接dom对象到页面上去的模板总结(必看)

    下面小编就为大家带来一篇在js代码拼接dom对象到页面上去的模板总结(必看)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • JavaScript实现经纬度转换成地址功能

    JavaScript实现经纬度转换成地址功能

    这篇文章主要介绍了JavaScript实现经纬度转换成地址,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-03-03
  • javascript实现获取cookie过期时间的变通方法

    javascript实现获取cookie过期时间的变通方法

    这篇文章主要介绍了javascript实现获取cookie过期时间的变通方法,因为cookie过期时间是由浏览器控制的,所以想获取过期时间只能通过本文的变通方法来实现,需要的朋友可以参考下
    2014-08-08
  • 详解微信小程序应用和页面生命周期

    详解微信小程序应用和页面生命周期

    生命周期是指一个对象从创建→>运行>销毁的整个阶段,强调的是一个时间段,文中介绍了生命周期的分类和微信小程序应用,需要的朋友可以参考下
    2022-08-08

最新评论