自定义小程序底部菜单

第一次写博客,如果有描述不当的地方,请多多包容,也欢迎指教。

做完第一个小程序的时候就觉得小程序的底部菜单有点坑,自己做的遮罩层根本无法遮住它,所以做第二个项目的时候,就决定自己模拟一个小程序底部菜单。下面说一下自己自定义底部菜单需要了解和注意的事项

1.小程序页面层级不能超过10级

2.小程序的wx.relaunch()可以清除所有页面痕迹并跳转至指定页面,但是,用户体验超级不好,跳转页面的时候会闪一下载跳转

3.小程序的wx.redirecto()关闭当前页面,跳转到应用内的某个页面,但是不允许跳转到 tabbar 页面。用户体验跟wx.relaunch()一样,让人看着就很不开心。

4.小程序的wx.navigateto()保留当前页面,跳转到应用内的某个页面,但是不能跳到 tabbar 页面。

5.小程序的wx.navigateBack可以通过delta返回至指定页面

综上所述,为了实现自定义的预想,又要解决用户体验问题。下面就是我的实现代码。

1.项目目录如上图

2.tabBar.wxml

<view class="wrapper">

<view hidden=‘{{isModal}}‘ class=‘barModal‘>

<view bindtap="hideToCreate" class=‘modal_bg‘></view>

<view class=‘inte_ite‘>

<view class="tobarItem" bindtap="toNewPost">

<image class="toImgbar" src="../../icon/index_material.png" />

<view>发帖子</view>

</view>

<view class="tobarItem" bindtap="toNewDynamic">

<image class="toImgbar" src="../../icon/index_enterprise.png" />

<view>发动态</view>

</view>

</view>

</view>

<view class="wrappe_tab">

<view bindtap=‘tabBarFun‘ class=‘item_con‘ id="{{item.id}}" wx:for="{{tabBarList}}" wx:key="id">

<image wx:if="{{!item.isCouter}}" class="{{item.class}}" src="{{item.iconPath}}" />

<image wx:if="{{item.isCouter}}" class="{{item.class}}" src="{{item.selectedIconPath}}" />

<view class="{{item.isCouter?‘tab_font isCouter‘:‘tab_font‘}}">{{item.text}}</view>

</view>

</view>

</view>

3.tabBar.js

const app = getApp();

Component({

data: {

isModal: true,

tabBarList: [

{

pagePath: "pages/index/index",

text: "首页",

id: 1,

isCouter: true,

class: "tab_logo",

color: "#888888",

iconPath: "../../icon/indexIcon.png",

selectedColor: "#2873ff",

selectedIconPath: "../../icon/indexIconSe.png",

link: ‘../index/index‘

},

{

pagePath: "pages/mall/mall",

text: "商城",

class: "tab_logo",

id: 2,

isCouter: false,

iconPath: "../../icon/selectCarIcon.png",

selectedIconPath: "../../icon/selectCarIconSe.png",

link: ‘../mall/mall‘

},

{

pagePath: "pages/new/new",

class: "logo_mid",

id: 5,

isCouter: true,

iconPath: "../../icon/tabBar_new.png",

selectedIconPath: "../../icon/tabBar_new.png"

},

{

pagePath: "pages/message/message",

text: "消息",

class: "tab_logo",

id: 3,

isCouter: false,

iconPath: "../../icon/consultingIcon.png",

selectedIconPath: "../../icon/consultingIconSe.png",

link: ‘../message/message‘

},

{

pagePath: "pages/mine/mine",

text: "我的",

id: 4,

isCouter: false,

class: "tab_logo",

color: "#888888",

selectedColor: "#2873ff",

iconPath: "../../icon/myIcon1.png",

selectedIconPath: "../../icon/myIconSe.png",

link: ‘../mine/mine‘

}

]

},

ready: function(options) {

var ts = this;

var pages = getCurrentPages();

var currentPage = pages[pages.length - 1]; //获取当前页面的对象

var url = currentPage.route; //当前页面url

var list = this.data.tabBarList;

if (url == "pages/index/index") {

list[0].isCouter = true;

list[1].isCouter = false;

list[4].isCouter = false;

list[3].isCouter = false;

this.setData({

tabBarList: list,

});

//debugger

} else if (url == "pages/mall/mall") {

list[1].isCouter = true;

list[0].isCouter = false;

list[4].isCouter = false;

list[3].isCouter = false;

this.setData({

tabBarList: list,

});

} else if (url == "pages/message/message") {

list[3].isCouter = true;

list[4].isCouter = false;

list[1].isCouter = false;

list[0].isCouter = false;

this.setData({

tabBarList: list,

});

} else if (url == "pages/mine/mine") {

list[4].isCouter = true;

list[0].isCouter = false;

list[1].isCouter = false;

list[3].isCouter = false;

this.setData({

tabBarList: list,

});

}

},

methods: {

hideToCreate: function () {

this.setData({

isModal: true,

});

},

toNewPost: function () {

wx.navigateTo({

url: ‘../index/newPost/newPost‘

});

this.setData({

isModal: true,

});

},

toNewDynamic: function () {

wx.navigateTo({

url: "../index/newDynamic/newDynamic"

});

this.setData({

isModal: true,

});

},

tabBarFun: function(e) {

var ts = this;

var id = Number(e.currentTarget.id);

var list = this.data.tabBarList;

var pages = app.pages;

console.log(‘length:‘+pages.length)

var currentPage = pages[pages.length - 1]; //获取当前页面的对象

var url = currentPage.route; //当前页面url

let len = 0,

flag = false;

// debugger

if (url != "pages/index/index" && id == 1) {

for (let i = 0; i < pages.length; i++) {

++len;

if (pages[i].route == "pages/index/index") {

flag = true;

break;

}

}

console.log(‘len:index‘+len);

if (flag) {

wx.navigateBack({

delta: pages.length - len

});

} else {

wx.navigateTo({

url: ‘pages/index/index‘

});

}

} else if (url != "pages/mall/mall" && id == 2) {

for (let i = 0; i < pages.length; i++) {

++len;

if (pages[i].route == "pages/mall/mall") {

flag = true;

break;

}

}

if (flag) {

wx.navigateBack({

delta: pages.length - len

});

} else {

wx.navigateTo({

url: ‘/pages/mall/mall‘

});

}

} else if (url != "pages/message/message" && id == 3) {

for (let i = 0; i < pages.length; i++) {

++len;

if (pages[i].route == "pages/message/message") {

flag = true;

break;

}

}

if (flag) {

wx.navigateBack({

delta: pages.length - len

});

} else {

wx.navigateTo({

url: ‘/pages/message/message‘

});

}

} else if (url != "pages/mine/mine" && id == 4) {

for (let i = 0; i < pages.length; i++) {

++len;

if (pages[i].route == "pages/mine/mine") {

flag = true;

break;

}

}

if (flag) {

wx.navigateBack({

delta: pages.length - len

});

} else {

wx.navigateTo({

url: ‘/pages/mine/mine‘

});

}

} else if (id == 5) {

this.setData({

isModal: !this.data.isModal,

})

}

}

}

})

4.tabBar.json

{

"component": true

}

5.tabBar.wxss

.wrapper{

height: 100rpx;

}

.item_con {

width: 20%;

float: left;

text-align: center;

height: 100rpx;

color: #444;

}

.modal_bg {

background-color:

rgba(100, 100, 100, 0.6);

position: fixed;

width: 100%;

height: 100%;

}

.barModal {

background-color:

rgba(100, 100, 100, 0.6);

position: fixed;

width: 100%;

height: 100%;

left: 0;

z-index: 1;

top: 0;

}

.inte_ite {

position: absolute;

bottom: 100rpx;

left: 0;

width: 100%;

}

.toImgbar {

width: 80rpx;

height: 80rpx;

}

.inte_ite {

">#fff;

padding: 10rpx;

}

.tobarItem {

width: 50%;

font-size: 28rpx;

float: left;

text-align: center;

}

.wrappe_tab {

position: fixed;

left: 0;

z-index: 2;

height: 100rpx;

width: 100%;

border-top: 1rpx solid #eee;

bottom: 0;

">#fff;

}

.tab_logo {

width: 45rpx;

height: 38rpx;

margin-top: 15rpx;

}

.tab_font {

font-size: 28rpx;

position: relative;

top: -4rpx;

}

.logo_mid {

width: 85rpx;

height: 65rpx;

margin-top: 17rpx;

}

.isCouter {

color: #2873ff;

}

6.在需要用到的页面文件中使用,如

//index.js

onShow(){

app.pages = getCurrentPages();

console.log(‘index.length:‘ + app.pages.length)

},

//index.json

{

"usingComponents": {

"tabBar": "../../component/tabBar/tabBar"

}

}

//index.wxml

<tabBar></tabBar>

原文地址:https://www.cnblogs.com/lqxlcc/p/9728348.html

时间: 2024-10-07 11:59:33

自定义小程序底部菜单的相关文章

微信小程序滑动菜单

好久没发博客了,发一条给2020打个卡 新手入坑小程序,网上没找到类似的示例,自己整了一个.多功能滑动展示 <!--pages/scrollMenu/scrollMenu.wxml--> <swiper class="navban" interval="{{interval}}" duration="{{duration}}" current="{{swiperCurrent}}" indicator-dot

Linux自定义应用程序及其菜单图标

在Linux桌面系统中,如果需要自己添加一个应用程序,如果是标准的bin, lib, share结构,我通常将其放在/usr/local/bin中.如果非这样,或者程序文件很多,易造成Linux系统目录结构混乱,我通常把应用程序放在/opt目录下.然后给该程序添加开始菜单快捷方式图标.图标文件.MIME配置等.文件权限均为rw-r--r--. 图标文件放在 /usr/share/icons MIME配置文件放在 /usr/share/mime 启动图标(.desktop)文件放在 /usr/sh

原生小程序底部弹出层动画过渡

1.wxml <view class="my-dialog" > <view class="my-mask" bindtap="confirmDialog" hidden="{{!showDialog}}" ></view> <view class="my-container" animation="{{animatheightadd}}">

小程序底部导航栏

在app.json文件中添加如下代码: "tabBar": { "color": "black", "backgroundColor":"#fff", "selectedColor": "#11cd6e", "borderStyle":"white", "list": [{ "selectedIco

小程序底部导航栏设置

tabBar与window.pages并列,pagePath点击进入的页面路径,selectedIconPath点击选中状态 "tabBar": { "color": "#353535", "selectedColor": "#3cc51f", "borderStyle": "white", "backgroundColor": "#ff

小程序的一些开发问题

1.小程序名称可以由中文.数字.英文.长度在3-20个字符之间,一个中文字等于2个字符. 2.小程序名称不得与公众平台已有的订阅号.服务号重复.如提示重名,请更换名称进行设置. 3.小程序名称在帐号信息设置时完成,请谨慎设置,一旦设置暂不支持修改. 4.更换名称进行设置.如果企业商标,组织名称等名称被侵权,可通过公众平台侵权投诉流程发起投诉,取回名称使用权. 5.个人开发者无法申请微信小程序:目前微信仅支持企业.政府.媒体.其他组织申请. 6.一个主体可以注册30个,一个绑定身份的开发者只能创建

微信小程序(二)框架

配置 配置app.json例子: { "pages": [ "pages/index/index", "pages/logs/index" ], "window": { "navigationBarTitleText": "Demo" }, "tabBar": { "list": [{ "pagePath": "pag

微信小程序-整理各种小程序源码和资料免费下载

微信小程序整理下载 [小程序源码]微信小程序-车源宝微信版 [小程序源码]小程序-微赞社区(论坛demo) [小程序源码]微信小程序-收支账单 [小程序工具]微信小程序-日历 [小程序源码]小程序-在线聊天功能 [小程序源码]微信小程序-大好商城(新增功能天气查询和2048游戏) [小程序源码]微信小程序-查询号码归属地 [小程序源码]微信小程序-备忘录2 [小程序源码]微信小程序-QQ音乐 [小程序源码]小程序-货币汇率 [小程序源码]微信小程序-大学图书馆 [小程序源码]小程序-积分商城 [

微信小程序开发-笔记

一.开发文件结构 1.根目录下有三个文件:app.js,app.json和app.wxss.一个小程序项目必须有的三个描述App的文件.这三个文件是应用程序级别的文件.这3个文件的意义: 表1.1  app.js,app.json和app.wxss文件的含义 文件 必填 作用 app.js 是 小程序逻辑文件 app.json 是 小程序配置文件 app.wxss 否 全局公共样式文件 2.和这三个应用程序级别文件平行的pages文件夹.一个小程序由若干个页面文件构成.每个页面由4个文件构成,分