您当前的位置:首页 > 电脑百科 > 程序开发 > 移动端 > 小程序

小程序自定义动态Tabbar导航栏

时间:2020-09-01 16:31:27  来源:  作者:

自定义动态Tabbar导航栏

在默认的小程序开发中,定义tabbar,需要在App.json中配置如下json:

"tabBar": {
    ...    "list": [
      {        "text": "首页",
        "iconPath": "/public/images/index.png",
        "selectedIconPath": "/public/images/index-act.png",
        "pagePath": "pages/job/index"
      }      ...    ]}

一经配置,无法修改。你可以调用setTabBarItem 设置按钮文字、图片路径;就是无法动态设置跳转地址、tabbar个数。

解决方案

我们需要新建一个中间页面,用来控制所有tabbar,把tabbar要关联的页面,都用组件的方式来写,这样,我们只要在这一个页面里,写个fix在底部的tabbar样式,点击不同tab,显示不同组件。

json文件

{
  "usingComponents": {
    "home" : "/pages/job/index",        // 首页
    "company" : "/pages/company/company",   // 公司
    "message" : "/pages/chat/index",    // 消息
    "mine" : "/pages/mine/index",   // 我的
    "tabbar" :  "/milfun/widget/custom-tab-bar", //自定义tabbar组件
  }}

wxml文件

<!-- wxml中,把页面设置成组件 -->
<home wx:if="{{activeTab == 'home'}}">首页</home>
<company wx:if="{{activeTab == 'company'}}">公司</company>
<message wx:if="{{activeTab == 'message'}}">消息</message>
<mine wx:if="{{activeTab == 'mine'}}">我的</mine>
<!-- wxml中,自定义tabbar组件 -->
<tabbar list="{{tabList}}" bindmytab="tabChange"></tabbar>

js文件

Page({
  data: {    activeTab:'home'    // company 、message、mine
  },  onLoad: function (options) {
    let tmp = 1;    // 用来控制显示不同方案的tabbar
    if( tmp === 1 ){    // 显示第一套tabbar
      this.setData({        tabList:[          {            "name": "...",
            "text": "...",
            "iconPath": "...",
            "selectedIconPath": "...",
            "pagePath": "..."
          },          ...        ]      })    }else{  // 显示第二套tabbar
        this.setData({            tabList:[{},...]        })      }    }})

上面展示的是中间页面的写法,那正常页面如何改成组件页面呢?

页面改成组件写法

其不同主要是在于js文件里面的写法不同,所以我们只看js部分:

正常写法

Page({
  data: {
  },  onLoad: function (options) {
  },  onShow: function (options) {
  },  func1:function(e){
    console.log(e)
  },  func2:function(e){
    console.log(e)
  },})

组件写法

Component({
  options: { // 为了使用全局css样式      addGlobalClass: true,
  },  data: {},  /*  * 组件被创建时调用,等同于上方的 onLoad  */  attached: function (options) {    
  },  /*  * 组件内部方法,等同于上方的自定义方法  */  methods: {    func1:function(e){
        console.log(e)
    },    func2:function(e){
        console.log(e)
    },  }})

 

小程序自定义动态Tabbar导航栏

 

 

这样,我们就实现了动态tabbar功能,tablist数据我们随时都可修改,怎么跳转,我们自己说了算!

 

输入框弹起页面上滑

遇见上面这个问题,我们的解决方案是:手动设置输入框位置。

js文件

// 输入框获取焦点
foucus:function (e) {
   this.setData({typerHeight: e.detail.height})},// 输入框失去焦点blur:function () {
   this.setData({typerHeight: 0})
},

wxml文件

<view class="tc-board"  style="bottom:{{typerHeight}}px" >
    ......</view>

这样,当输入框获取焦点时,会获取到键盘的高度,然后把输入框这个view的bottom样式,设置成你获取的高度,就完美的贴在输入框上方。当输入框失去焦点时,高度设置成0,输入框view又回到了页面的底部。

异步请求回调 + Token验证

为了避免在业务中书写繁杂的if else语句嵌套,或者回调函数

// 方法一
onLoad:function (e) {
   // if嵌套
   if(){
        if(){
            if(){ // do something }
        }   }   // 回调陷阱   func1(data,func(){        func2(data,func(){            func3(data,func(){                // do something
            })        })   })},

我的做法是,为方法添加promise,举个例子:

公共功能js文件

/**
 * 统一post请求接口 * @param {*} e “url,data,contentType,noOuth” */function post(e){
  // token 保存在缓存中,有需要时调取  let header = { 'Content-Type': contentType, 'Authorization':'Bearer ' + getCache('accessToken') }
  // 封装在promise中  return new Promise(function (resolve, reject) {
    wx.request({      url:  config.domain + e.url , // domain统一放在config中
      data:e.data,      method: 'POST',
      header: header,      success: res => {        // console.log(res)
        if(res.data.code == 200 ){
          resolve(res.data)     // 请求成功,返回数据        }        else{
          wx.showToast({              title: res.msg,              icon: 'none',
              duration: 1500,
          });          reject(res.data.msg)  // 请求出错,显示错误        }      },      fail: res => {    // 请求失败        wx.showToast({          title:  '请求发送失败',
          icon: 'none',
          duration: 1500,
        });      }    })  })}

页面js文件

// 方法一
onLoad:function (e) {
   fun.post({ url:'...',data:{...} })
   .then( res => console.log(res) )     // 步骤一
   .then( res => console.log(res) )     // 步骤二
   .then( res => console.log(res) )     // 步骤三
   .catch( res => console.log(res) )    // 捕捉异常
},

这样写起来思路清晰,优雅,感觉棒棒哒!

接口统一管理

有了上述的post接口,我们在开发中会有很多的请求接口,如果都写在页面中,难以管理,如有修改,要一个个页面找过去,比较麻烦,我的做法是:

在模块目录下新建一个js,用来保存所有接口信息。为什么在模块下呢?因为考虑到可能有不同的分包、如果都写在一起会太多,分太细又带来管理的不便,具体如何,请根据具体项目来操作。

api接口统一管理文件

/**
 * 该模块下所有接口
 * 接口参数:
 *  url: just url
 *  contentType: default:false( use urlencoded ) or true( use json )
 *  noOuth: default:false( hase Authorization ) or true( no Authorization )
 */
const constApi = {
    // 获取用户信息
    getUserInfo : {     // 定义接口调用的名字
        url: 'api/v1/userinfo'
    },
    // 获取用户设置
    getUserSetting: {
        url: 'api/v1/usersetting',
        outh:true   // 需要鉴权
    }
}
/**
 * 对外接口统一调用
 * @param {*} name  在api文件中的key
 * @param {*} data  要post的数据
 */
const http = async function(key,data){
    let api = constApi[key];
    let response = await fun.post({
        url:api.url,
        data:data,
        contentType:api.contentType,
        outh:api.noOuth
    })
    return response
}
export default http

使用方法

// 导入api文件
import Api from './api-index.js'
onLoad:async function (e) {    // 用法一
    Api('getUserInfo ',{
        userId:1,
        userPwd:123456,
        ...    })    .then( res => console.log(res) )
    ...    // 用法二
    let tmp = await Api('getUserInfo',{...})
    this.setData({ list: tmp })
},

到时候如果接口修改了,或者地址更换了,就不用满大街去找那些页面用到了接口,一个个修改。只需要在api-index.js中,统一修改和管理了。

 


作者:MilFun
链接:https://juejin.im/post/6865920270218035214
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。



Tags:小程序   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
支付宝拥有一系列城市便民服务功能,可以帮助我们在线查看各种信息,结婚状态也可以查询了,那么具体怎么操作?今天小编就为大家带来这篇教程,还不会的同学快来学习一下吧!支付宝怎么...【详细内容】
2021-12-24  Tags: 小程序  点击:(5)  评论:(0)  加入收藏
有不少同学学完Python后仍然很难将其灵活运用。我整理15个Python入门的小程序。在实践中应用Python会有事半功倍的效果。01 实现二元二次函数实现数学里的二元二次函数:f(x,...【详细内容】
2021-12-22  Tags: 小程序  点击:(32)  评论:(0)  加入收藏
微信小程序“无障碍急救平台”日前上线,解决听障人士120急救呼叫难题。听障人士在日常生活、工作中常有信息缺失、沟通不良的困难。如果自身或身边人突发急症,则需要依靠他人...【详细内容】
2021-12-15  Tags: 小程序  点击:(10)  评论:(0)  加入收藏
一、项目背景随着小程序在用户规模和商业化上取得的极大成功,各大平台都推出了自己的小程序。然而这些平台的小程序开发在语法上又不尽相同,不同平台小程序代码的维护需要投入...【详细内容】
2021-11-05  Tags: 小程序  点击:(65)  评论:(0)  加入收藏
现如今卖东西的渠道是越来越多,如今在微信小程序也能开店卖东西了,有的小伙伴想在小程序上卖东西但不知道该怎么做,下面就来讲讲微信小程序如何做店铺,利用微信小程序!但凡得到公...【详细内容】
2021-11-03  Tags: 小程序  点击:(32)  评论:(0)  加入收藏
作者:灰灰来源:JS每日一题 一、背景传统的web开发实现登陆功能,一般的做法是输入账号密码、或者输入手机号及短信验证码进行登录服务端校验用户信息通过之后,下发一个代表登录态...【详细内容】
2021-10-29  Tags: 小程序  点击:(43)  评论:(0)  加入收藏
一、微信服务号主要偏于服务交互(类似银行,114,提供服务查询),认证前后都是每个月可群发4条消息(不适用于个人)二、微信订阅号主要偏于为用户传达资讯(类似报纸杂志),认证前后都是每天...【详细内容】
2021-10-22  Tags: 小程序  点击:(82)  评论:(0)  加入收藏
总结列举微信小程序开放能力清单 硬件能力 蓝牙 NFC读写 连接WIFI设备 开放能力 ...【详细内容】
2021-09-27  Tags: 小程序  点击:(60)  评论:(0)  加入收藏
功能说明脱离公众号下的小程序,单独使用功能特点小程序:是一种不需要下载安装即可使用的应用,它实现了应用“触手可及”的梦想,用户扫一扫或者搜一下即可打开应用。也体现了“用...【详细内容】
2021-09-27  Tags: 小程序  点击:(46)  评论:(0)  加入收藏
随着人们生活水平的不断提高,如今智能电视的普及率已经非常高。然而大家在使用智能电视的时候经常会遇到“无法安装第三方应用”的情况。为了解决这个问题,今天我以市场占有率...【详细内容】
2021-09-15  Tags: 小程序  点击:(81)  评论:(0)  加入收藏
▌简易百科推荐
一、项目背景随着小程序在用户规模和商业化上取得的极大成功,各大平台都推出了自己的小程序。然而这些平台的小程序开发在语法上又不尽相同,不同平台小程序代码的维护需要投入...【详细内容】
2021-11-05  携程技术    Tags:小程序   点击:(65)  评论:(0)  加入收藏
作者:灰灰来源:JS每日一题 一、背景传统的web开发实现登陆功能,一般的做法是输入账号密码、或者输入手机号及短信验证码进行登录服务端校验用户信息通过之后,下发一个代表登录态...【详细内容】
2021-10-29  Nodejs开发    Tags:微信小程序   点击:(43)  评论:(0)  加入收藏
总结列举微信小程序开放能力清单 硬件能力 蓝牙 NFC读写 连接WIFI设备 开放能力 ...【详细内容】
2021-09-27  软件开发分享    Tags:微信小程序   点击:(60)  评论:(0)  加入收藏
核心商城(CoreShop)介绍核心小程序商城系统(CoreShop) 是基于 Asp.Net 5.0、Uni-App开发、支持可视化布局的小程序商城系统;前后端分离,支持分布式部署,跨平台运行;拥有分销、代理、...【详细内容】
2021-07-20  码农也有梦想    Tags:小程序商城   点击:(115)  评论:(0)  加入收藏
介绍Vue3发布已经有一段时间了,从目前来看,其生态还算可以,也已经有了各种组件库给予了支持,但是不管是Vue3还是Vue2都无法直接用来开发小程序,因此国内一些技术团队针对Vue开发...【详细内容】
2021-07-13  爱分享Coder    Tags:小程序   点击:(203)  评论:(0)  加入收藏
首先明确几个概念1. W3C:指万维网联盟(World Wide Web Consortium),是一个国际的标准的制定机构。2. H5(HTML5,HyperText Markup Language 5的缩写),HTML5 是由W3C制定的新HTML标...【详细内容】
2021-07-06  畅游零和一的海洋    Tags:微信小程序   点击:(153)  评论:(0)  加入收藏
在开发微信公众号时,需要不时请求URL和数据封装。为了不做重复的工作。提取公共部分进行封装。产生了相应的公众类。今天先来写下请求类,代码如下:public class HttpRequestP...【详细内容】
2021-06-16  java浮萍  今日头条  Tags:公共类   点击:(134)  评论:(0)  加入收藏
小程序上线后,改版了很多次,包括一些 Api 接口也有改动。如果你学习一个很久之前的小程序项目是没有意义的,本文推荐的小程序都是最近有更新的。相信在你学习、部署的过程中,不...【详细内容】
2021-06-08    程序猿久一  Tags:微信小程序   点击:(206)  评论:(0)  加入收藏
自从2019年微信公开课Pro在微信之夜演示《跳一跳》以来,微信小游戏已经不知不觉走过的三年,这三年中我们可以明显看到微信对小游戏的扶持,对于微信开发者来说,微信小游戏开发以...【详细内容】
2021-05-25  开课吧科科  今日头条  Tags:微信小游戏   点击:(212)  评论:(0)  加入收藏
学习编程从hello world开始。学习微信小程序开发首先要安装一个微信开发者工具,官网上免费下载童叟无欺,下载完傻瓜式安装即可。 双击微信开发者工具,然后选择小程序,然后点击...【详细内容】
2021-05-12  程序员fearlazy  fearlazy  Tags:微信小程序   点击:(268)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条