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

news2025/2/24 16:09:11

在这里插入图片描述

🤵‍♂️ 个人主页: @计算机魔术师
👨‍💻 作者简介:CSDN内容合伙人,全栈领域优质创作者。

🌐 推荐一款找工作神器网站: 点击跳转牛客网 |笔试题库|面试经验|实习招聘内推|

还没有账户的小伙伴 速速点击链接登录注册把!🎉🎉

该文章收录专栏
✨ 2022微信小程序京东商城实战 ✨

文章目录

  • 一、前提概要
  • 二、 动态显示info消息
  • 三、 页面切换效果
  • 四、 配置总结

一、前提概要

效果:实现一个自定义tabBar,使消息tabBar能够显示消息数量,并通过全局共享的方式,控制消息数量 在这里插入图片描述


需要的知识点如下:

  1. mobx辅助库(全局共享,见文章)
  2. vant组件库(见文章)
  3. 组件的behavior (见文章)
  4. 自定义组件
  5. 样式隔离
  6. 组件数据监听器

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

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

注意:在配置自定义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,通过页面循环即可实现,且所循环数据都能很好满足数据需求,如图像链接,文本等

	  🤞到这里,如果还有什么疑问🤞
🎩欢迎私信博主问题哦,博主会尽自己能力为你解答疑惑的!🎩
 	 🥳如果对你有帮助,你的赞是对博主最大的支持!!🥳

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/405740.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue系列(三)——手把手教你搭建一个vue3管理后台基础模板

目录 一、前言&#xff1a; 二、网站页面分析 三、开发步骤 &#xff08;一&#xff09;、安装element &#xff08;二&#xff09;、安装使用svg插件 &#xff08;三&#xff09;、编写主界面框架代码 &#xff08;四&#xff09;、编写菜单栏 &#xff08;五&#xff0…

如何使用wireshark抓取HTTPS数据包?

1、wireshark 抓包为什么不显示出来&#xff1f; wireshark 是基于网络层的抓包工具&#xff0c;通过捕获通信双方的TCP/IP包实现内容提取。对于应用层的数据&#xff0c;如果应用层协议是公开的&#xff0c;就可以直接显示数据。处理HTTPS 协议时&#xff0c;因为不知道客户端…

前端知识——css之flex布局

1.基本概念 flex布局是一种布局模型&#xff0c;经常被称之为flexbox&#xff0c;使用flex布局之后&#xff0c;他会给子元素提供强大空间分配和对齐能力。 在没有使用flex布局之前&#xff0c;常用布局有&#xff1a;流式布局&#xff0c;浮动布局&#xff0c;定…

Vite代理解决跨域问题

Vite代理解决跨域问题 我们在编写前端项目的时候&#xff0c;经常会遇到跨域的问题&#xff0c;当我们访问后端 API 的 URL 路径时&#xff0c;只要域名、端口或访问协议&#xff08;如 HTTP 和 HTTPS&#xff09;有一项不同&#xff0c;就会被浏览器认定为跨域。另外我们也会…

小程序真机调试提示系统错误

Error: 系统错误&#xff0c;错误码&#xff1a;80051,source size 7935KB exceed max limit 2MB [20220929 16:18:58][wxfc8aa5984cac7f72] [1.06.2208010][win32-x64]// 说明你源文件大小为7985kb 超过了2M 所以编译失败解决方法 1. 压缩项目中的图或转为base64格式 …

【Spring+SpringMVC+Mybatis】Spring+SpringMVC+Mybatis实现前端到后台完整项目

文章目录&#x1f3f4;‍☠️SpringMVC简介SpringMVC是什么SpringMVC的基础架构SpringMVC的优点&#x1f3f3;️‍&#x1f308;SpringMVC接管Web说明三层框架SpringMVC的简单开发&#x1f6a9;Spring搭建&#x1f6a9;Mybatis搭建&#x1f3c1; Spring整合Mybatis✅结语&#…

(element-ui)取消el-table的hover状态,取消高亮显示

文章目录前言方法一 ------覆盖css样式方法二------卸载掉背景颜色&#xff08;类似于方法一&#xff09;方法三------使用函数方法方法四------禁用鼠标悬浮怎么办&#xff1f;究极解决------将错就错前言 在使用element-ui的el-table表格的过程中&#xff0c;会发现&#xf…

VsCode配置JavaWeb(最新)

我个人是很喜欢VsCode的&#xff0c;开源免费、功能全面。所以为了方便&#xff0c;我把我几乎所有的运行都集成到了VsCode上来&#xff0c;JavaWeb也不例外。 前言 之前也在CSDN上看到有些博主写了配置方法&#xff0c;但是很不幸的是&#xff0c;插件Tomcat for java已经不可…

Web过滤器:Filter

Filter 概述工作原理生命周期web.xml配置的常用节点FilterConfig类过滤器链FilterChainHttpFilter的简化设计自动登录功能的改进验证登入页面的改进浏览器的缓存功能概述 Filter过滤器,是Servlet技术中最实用的技术,能够管理Web服务器的所有Web资源,实现信息拦截、权限访问控…

vue动态路由添加,vue-router的addRoute方法实现权限控制,添加根路由和子路由

addRoute路由分为静态路由和动态路由静态路由和动态路由的优缺点动态路由实现思路&#xff1a;动态路由遇到的问题与解决方式动态添加子路由路由分为静态路由和动态路由 静态路由和动态路由的优缺点 1、中大型项目&#xff0c;采用的都是动态路由方式,因为后台导航目录运营人…

Vue3如何封装组件?

&#x1f525;&#x1f525;&#x1f525;欢迎关注csdn前端领域博主: 前端小王hs &#x1f525;&#x1f525;&#x1f525;email: 337674757qq.com &#x1f525;&#x1f525;&#x1f525;前端交流群&#xff1a; 598778642 在开发Vue3项目的过程中&#xff0c;我们经常会使…

H5页面跳转微信小程序时:wx.miniProgram.navigateTo 报错 ‘wx‘ is not defined no-undef

有一个功能&#xff0c;需要从H5页面跳转到微信小程序&#xff0c;查了微信官方文档&#xff1a;只需要引入js文件&#xff0c;然后直接使用即可&#xff1a; 1&#xff1a;引用&#xff1a; 当然也可以下载下来直接引用项目具体位置的js文件 2: 使用&#xff1a; 然后一直报错…

vue3 hooks使用

vue3 hooks使用 今天我们稍微说一下 vue3 项目中的 hooks 的使用&#xff0c;其实这个 hooks 呢是和 vue2 当中的 mixin 是类似的&#xff0c;学习过 vue2 的小伙伴一定对 mixin 一定比较熟悉&#xff0c;就算没用过也一定了解过&#xff0c;也就是混入&#xff0c;通过 mixin …

useDark的使用方法以及Element-Plus深色主题切换案例(vue3)

useDark 顾名思义&#xff0c;是否使用深色模式&#xff0c;useDark它是通过读取localStorage/sessionStorage的存储值&#xff08;key 是可自定义的&#xff09;。从而设置html的class。VueUse的官方案例使用了Tailwind CSS 偏好的暗模式。因为我们不一定都用得到Tailwind CSS…

vue实现本地预览word(docx)、excel(xlsx)、pdf文件

vue实现本地预览word(docx)、excel(xlsx)、pdf文件 实现效果&#xff1a; 通过点击预览&#xff0c;浏览器打开新标签页展示文件内容 word效果&#xff1a; pdf效果&#xff1a; excel效果&#xff1a; 前期准备&#xff1a; word插件&#xff1a; npm install --save …

【TFS-CLUB社区 第5期赠书活动】〖Python OpenCV从入门到精通〗等你来拿,参与评论,即可有机获得

文章目录❤️‍&#x1f525; 赠书活动 - 《Python OpenCV从入门到精通》❤️‍&#x1f525; 编辑推荐❤️‍&#x1f525; 内容提要❤️‍&#x1f525; 赠书活动 → 获奖名单❤️‍&#x1f525; 赠书活动 - 《Python OpenCV从入门到精通》 内容简介&#xff1a; 《Python O…

【uniapp】页面下拉刷新

目录 一、全局 二、局部 1、一个页面一个下拉刷新 2、一个页面多个下拉刷新&#xff08;切换时滚动条回到顶部&#xff09; 3、一个页面多个下拉刷新&#xff08;切换时恢复滚动条位置&#xff09; 一、全局 修改pages.json的"enablePullDownRefresh": true, …

【Node.js实战】一文带你开发博客项目之登录(前置知识)

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;也会涉及到服务端 &#x1f4c3;个人状态&#xff1a; 在校大学生一枚&#xff0c;已拿多个前端 offer&#xff08;秋招&#xff09; &#x1f680;未…

微信小程序自定义组件(超详细)

&#x1f48c;写在开头&#xff1a; 哈喽呀&#xff0c;亲爱的宝子们。 今天要介绍的是关于小程序自定义组件的相关内容。 主要分以下几个部分&#xff1a;组件的创建&#xff0c;组件的结构&#xff0c;组件的引用&#xff0c;组件样式&#xff0c;组件的生命周期等。 文章目录…

【蓝桥杯真题】当蓝桥杯开设Web组之后,对几题能拿省一?

目录 &#x1f3c6;难度分析 &#x1f3c6;一、水果拼盘 &#x1f3c6;二、展开你的扇子 &#x1f3c6;三、和手机相处的时光 &#x1f3c6;四、灯的颜色变化 &#x1f3c6;五、冬奥大抽奖 &#x1f3c6;六、蓝桥知识网 &#x1f3c6;七、布局切换 &#x1f3c6;八、购…