优雅的实现微信小程序动态tabBar及组件中实现动态数据

这篇具有很好参考价值的文章主要介绍了优雅的实现微信小程序动态tabBar及组件中实现动态数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这段时间在开发一个微信小程序,有个需求是,小程序底部的tabBar导航实现动态化。就是根据用户角色不同,显示不同的导航。要实现动态导航首先要考虑的是如何把小程序中的原生导航更改为自定义导航。

一、根据官方文档所说,实现自定义导航首先要在app.js中配置好tabBar项;

"tabBar": {
    "custom": true,
    "color": "#7A7E83",
    "selectedColor": "#2a83f7",
    "backgroundColor": "#ffffff",
    "list": [{
      "iconPath": "images/icon/home.png",
      "selectedIconPath": "images/icon/home-a.png",
      "pagePath": "pages/index/index",
      "text": "首页"
    }, {
      "iconPath": "images/icon/classify.png",
      "selectedIconPath": "images/icon/classify-a.png",
      "pagePath": "pages/picSort/index",
      "text": "全部分类"
    }, {
      "iconPath": "images/icon/chat.png",
      "selectedIconPath": "images/icon/chat-a.png",
      "pagePath": "pages/chat/index",
      "text": "聊一聊"
    }, {
      "iconPath": "images/icon/user.png",
      "selectedIconPath": "images/icon/user-a.png",
      "pagePath": "pages/myCentre/index",
      "text": "我的"
    }]
  }

注意:"custom": true是重点,默认是没有这个字段的,在配置项中新增即可;

二、在项目的根目录创建“custom-tab-bar”组件;

微信小程序动态tabbar,恒相产品画册技术专栏,微信小程序,小程序,前端

 三、编写custom-tab-bar组件的导航页面布局、样式表及JS;

index.wxml

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

说明:以上代码中 

 index.wxss

.tab-bar {
  position: fixed;
  bottom: 0;
  left: 0;
  right: 0;
  height: 96rpx;
  background: white;
  display: flex;
  padding-bottom: env(safe-area-inset-bottom);
  border-top: 2rpx solid #dddddd;
}

.tab-bar .tab-bar-item {
  flex: 1;
  text-align: center;
  display: flex;
  justify-content: center;
  align-items: center;
  flex-direction: column;
  height: 100%;
}

.tab-bar .tab-bar-item .tab-bar-item-img .itemImage {
  width: 54rpx;
  height: 54rpx;
}

.tab-bar .tab-bar-item .tab-bar-item-title .itemTitle {
  font-size: 20rpx;
}

index.js 

Component({
  data: {
    tabIndex: 0
    custom: true,
    color: "#7A7E83",
    selectedColor: "#2a83f7",
    backgroundColor: "#ffffff",
    list: [{
      iconPath: "images/icon/home.png",
      selectedIconPath: "images/icon/home-a.png",
      pagePath: "pages/index/index",
      text: "首页"
    }, {
      iconPath: "images/icon/classify.png",
      selectedIconPath: "images/icon/classify-a.png",
      pagePath: "pages/picSort/index",
      text: "全部分类"
    }, {
      iconPath: "images/icon/chat.png",
      selectedIconPath: "images/icon/chat-a.png",
      pagePath: "pages/chat/index",
      text: "聊一聊"
    }, {
      iconPath: "images/icon/user.png",
      selectedIconPath: "images/icon/user-a.png",
      pagePath: "pages/myCentre/index",
      text: "我的"
    }]
  },
  methods: {
    switchTab(e) {
      const data = e.currentTarget.dataset
      // console.log('currentTarget:', data.index)
      const url = data.path
      wx.switchTab({url})
      this.setData({
        selected: data.index
      })
    }
  }
})

重点:在实现自定义tabbar的时候,会出现点击导航,高亮状态及跳转链接出现混乱的现象, 这是因为使用Component组件是不允许设置动态数据的。下面会一并解决如何解决这些问题。

四、上面部分不是重点,在任何地方都能搜索。而实现动态 tabbar是写这边文章的重点

 1、我们先在utils目录中创建tab-service.js文件,写上全局的数据及方法;

// Tab页的data
let tabData = {
  tabIndex: 0,
  tabBar: {
      showplate: '',
      custom: true,
      color: "#7A7E83",
      selectedColor: "#2a83f7",
      backgroundColor: "#ffffff",
      list: [{
        iconPath: "/images/icon/home.png",
        selectedIconPath: "/images/icon/home-a.png",
        pagePath: "/pages/index/index",
        text: "首页"
      }, {
        iconPath: "/images/icon/classify.png",
        selectedIconPath: "/images/icon/classify-a.png",
        pagePath: "/pages/picSort/index",
        text: "全部分类"
      }, {
        iconPath: "/images/icon/chat.png",
        selectedIconPath: "/images/icon/chat-a.png",
        pagePath: "/pages/chat/index",
        text: "聊一聊"
      }, {
        iconPath: "/images/icon/user.png",
        selectedIconPath: "/images/icon/user-a.png",
        pagePath: "/pages/myCentre/index",
        text: "我的"
      }]
  }
}

// 更新菜单
const updateRole = (that, type) => {
  if (type === '0') {
    tabData.tabBar.list.forEach((item, i) => {
      if (item.text === '我的') {
        tabData.tabBar.list.splice(i, 1)
      }
    })
  } else if (type === '1') {
    const num = tabData.tabBar.list.length
    if (num === 3) {
      tabData.tabBar.list.push({
        iconPath: "/images/icon/user.png",
        selectedIconPath: "/images/icon/user-a.png",
        pagePath: "/pages/myCentre/index",
        text: "我的"
      })
    }
  }
  // console.log('tabData:', tabData)
  updateTab(that);
}

// 更新底部高亮
const updateIndex = (that, index) => {
  tabData.tabIndex = index;
  updateTab(that);
}

// 更新Tab状态
const updateTab = (that) => {
  if (typeof that.getTabBar === 'function' && that.getTabBar()) {
      that.getTabBar().setData(tabData);
  }
}

// 将可调用的方法抛出让外面调用
module.exports = {
  updateRole, updateTab, updateIndex
}

2、把custom-tab-bar目录中的index.wxml修改为下面这段

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

其中tabBar就是在tab-service.js文件中写的公共数据。

2、把index.js修改为下面这段

Component({
  data: {
    
  },
  methods: {
    switchTab(e) {
      const data = e.currentTarget.dataset
      // console.log('currentTarget:', data.index)
      const url = data.path
      wx.switchTab({url})
      this.setData({
        selected: data.index
      })
    }
  }
})

3、重点是在对应导航的JS文件中找到onShow方法,写上tabService.updateIndex(this, 0),其中tabService就是我们写的全局tab-service.js,引入一下

const tabService = require("../../utils/tab-service")

在js,onShow方法写上tabService.updateIndex(this, 0),这是因为需要调用一次刷新事件。如果导航有4个,每个导航对一个页面,0,1,2,3以此类推即可;

onShow: function () {
    tabService.updateIndex(this, 0)
}

4、 因为我要实现页面加载时判断用户,根据用户的不同改变导航的。所以我在onLand方法中去判断调用tabService.updateRole(this, res.data.showplate)这个公共的方法;

这样就完全解决了动态tabbar的效果;文章来源地址https://www.toymoban.com/news/detail-532983.html

到了这里,关于优雅的实现微信小程序动态tabBar及组件中实现动态数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序子页面自定义tabbar组件

    有时候微信小程序会遇到代码合并,就比如把B小程序代码迁移到A小程序,要使得B作为A小程序的一个子页面子功能。因为本身小程序都有tabbar,原来B也有,这时候就要给B子功能自定义一个tabbar底部导航栏。(注意,这个不是微信小程序自定义tabBar,不需要app.json中设置一个

    2024年02月08日
    浏览(39)
  • 微信小程序使用van组件Tabbar 标签栏

    (1)打开我们小程序的项目目录,然后打开文件所在的位置。 (2)cmd 窗口初始化 (3)通过 npm 安装vant/weapp (4)安装 miniprogram (5)修改 app.json app.json 中的 “style”: “v2” 去除 (6)修改 project.config.json 开发者工具创建的项目,miniprogramRoot 默认为 miniprogram,package.json 在

    2024年02月06日
    浏览(33)
  • uniapp 微信小程序使用uview u-tabbar组件自定义tabbar

    1.在components文件下面新建TabBar.vue组件, 使用uview的u-tabbar组件进行二次封装; u-tabbar组件中value取当前匹配项的name, 一般从父组件传过来即可; 在u-tabbar-item标签内可以使用插槽 slot=\\\'inactive-icon\\\'(选中的图标)和slot=\\\'inactive-icon\\\'(未选中的图标)自定义图片样式 u-tabbar组件默认已经为i

    2024年02月13日
    浏览(47)
  • GPT问答记录:微信小程序动态tabBar开发配置(服务端+前端代码)

    答1: 好的,下面是一个具体的方案供你参考,包括数据库表设计、Java 后台代码和小程序前端代码。请注意,这个方案仅供参考,具体实现可能需要根据你的实际需求进行调整。 数据库表设计 首先,需要设计一个 tabBar 数据表来存储 tabBar 配置信息,该表包含以下字段: i

    2023年04月22日
    浏览(41)
  • 超详细版:HBuilderX中实现uniapp小程序动态tabBar

    开发过程中遇到了动态tabBar的需求,用户登录后要根据用户信息动态展示tab栏,这里跟PC端的用户权限页面是一个意思,核心步骤就是: 先在Page.json文件中tabBar/list数组内配置好所有需要展示的页面,这里只需要在list各对象中设置好 pagePath 这个必填属性就好( 必填属性 ,不填

    2024年02月11日
    浏览(27)
  • 【微信小程序入门到精通】— 微信小程序实现多页面切换(tabBar)

    对于目前形式,微信小程序是一个热门,那么我们该如何去学习并且掌握之后去做实际项目呢? 为此我特意开设此专栏,在我学习的同时也将其分享给大家! 本篇文章将给大家带来如何添加页面切换效果,我们前面所讲解的都是停留在某一页面上面进行预览,接下来我们将

    2024年02月03日
    浏览(69)
  • 微信小程序自定义tabBar简易实现

    index.wxml index.json index.js index.css 如果是componet的页面就直接再show中自己定义它的selected代表当前的选中态

    2024年02月03日
    浏览(34)
  • uniapp微信小程序实现不同账号权限显示不同tabbar

    一套小程序可能会有多个用户角色,比如在线课堂类小程序,会有老师和学生,但是两者能看到的内容应该是不一样的。 舍弃uniapp原生的tabbar,使用uView插件下的u-tabbar导航插件来实现。 uView的官网如下,里面有详细的教程,而且在uniapp插件市场也能找到,使用起来也是非常

    2024年02月16日
    浏览(34)
  • 微信小程序底部tabbar自定义 实现凸起+透明底部效果

    先上图看效果: 步骤: 1、在文件根目录下创建一个文件夹:custom-tab-bar并分别创建 (js,json,wxml,wxss)类型文件 2、在pages.json中设置tabbar中的custom为true(true自定义,false默认系统) 3、index.js代码如下:

    2024年02月09日
    浏览(43)
  • 19_微信小程序之优雅实现侧滑菜单

    19_微信小程序之优雅实现侧滑菜单 一.先上效果图 要实现这样一个效果,布局其实很简单,整体布局是一个横向滚动的scroll-view,难点在于怎么控制侧滑菜单的回弹,以及寻找回弹的边界条件? 此篇文章主要是基于uni-app来实现的,以后也将继续使用uni-app,但是即使使用的是原

    2024年02月09日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包