文章目录
**
uniapp tabBar
**,在使用uniapp框架开发项目的时候,官方的tabBar总是满足不了设计稿上面的要求。通常这时候都会自定义tabBar,但是自定义会牺牲一些用户体验,比如在切换的时候tabBar会闪烁,特别是用户的硬件不太高端的时候闪烁得更加明显,还有自定义tabBar使用uni.redirectTo的话切换页面每次都会调用onLoad,页面数据得不到缓存。
这里提供在原生基础上修改tabBar,下面咋们一起来看看如何实现。
uniapp成长之路
成长,就好比我人生中的一艘小船,行驶在波面上。有时风平浪静,有时也会遇到汹涌辣咸,样样都有。
初识uniapp的时候,知道他是跨平台,且开源案列多 ,上手快,正好公司项目,需要这样一个框架,于是从零基础慢慢累积到独立开发完整项目,还好官方针对每个组件,讲解的都很详细,真的是很容易上手(这里针对怕uniapp不易上手的同学们,着重说一下),而且很多成熟的组件案列,基本每个板块的都有。
于是 uniapp系列的文章,就是我成长之路的见证,成长之路的笔记,欢迎大家和我一起学习讨论,解决问题,深入研究,创建自己的组件。
时代大浪,滚滚向前。如果你顺流而行,可以化身为弄潮儿,大展身手;但如果你逆流而动,则会被大潮猛击,深受重创,乃至粉身碎骨。在名为时代的列车上,有人同步起飞,也有人惨遭抛弃。对前者而言,这是最好的时代;然而对后者来说,这是最坏的时代。
1️⃣ tabBar详解
如果应用是一个多 tab 应用,可以通过 tabBar 配置项指定一级导航栏,以及 tab 切换时显示的对应页。
在 **pages.json** 中提供 tabBar 配置,不仅仅是为了方便快速开发导航,更重要的是在App和小程序端提升性能。在这两个平台,底层原生引擎在启动时无需等待js引擎初始化,即可直接读取 pages.json 中配置的 tabBar 信息,**渲染原生tab**。
"tabBar": {
"color": "#7A7E83",
"selectedColor": "#3cc51f",
"borderStyle": "black",
"backgroundColor": "#ffffff",
"list": [{
"pagePath": "pages/component/index",
"iconPath": "static/image/icon_component.png",
"selectedIconPath": "static/image/icon_component_HL.png",
"text": "组件"
}, {
"pagePath": "pages/API/index",
"iconPath": "static/image/icon_API.png",
"selectedIconPath": "static/image/icon_API_HL.png",
"text": "接口"
}]
}
1.1 tabBar所有属性
1.2 list所有属性
其中 list 接收一个数组,数组中的每个项都是一个对象,其属性值如下:
2️⃣ 中间大图标突出
在实际页面开发中,经常有中间突出的tab需求。在处理数据相对麻烦。 以组件方式来导入,就要在pages.json中配置的tabBar的每一个页面中导入该组件,当然也可以选择全局导入。 组件形式配置,页面的各项生命周期都可以正常使用,重新自定义tabBar样式也方便。
效果图
2.1 pages.json配置
"tabBar": {
"color": "#cbcbcb",
"selectedColor": "#f5cb2b",
"borderStyle": "black",
"backgroundColor": "#FFFFFF",
"list": [{
"pagePath": "pages/index/index"
}, {
"pagePath": "pages/look/look"
}, {
"pagePath": "pages/enter/enter"
}, {
"pagePath": "pages/my/my"
}, {
"pagePath": "pages/enter/enterInfo"
}]
}
2.2 创建tabBar组件
在components文件夹下创建 tabbar文件夹 tabbar.vue,在static下创建 tab用来放置图片。
tabBar代码
<template>
<view>
<view class="tabbar-container" :class="isIpx?'IpxBot':''">
<view class="tabbar-item" v-for="(item,index) in tabList" :class="[item.centerItem ? 'center-item' : '']"
@click="changeItem(item)" :key="index">
<view class="item-top" :style="{padding: item.id == 2?0:'10rpx'}">
<image :src="tabId==item.id?item.selectIcon:item.icon" mode=""></image>
</view>
<view class="item-bottom" :class="[tabId==item.id ? 'item-active' : '']">
<text>{{item.text}}</text>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
props: {
currentPage: {
type: Number,
default: 0
}
},
data() {
return {
//适配IPhoneX
isIpx: false,
//底部Tab
tabId: 0,
tabList: [{
id: 0,
path: "/pages/index/index",
icon: "/static/tab/home.png",
selectIcon: "/static/tab/home_select.png",
text: "首页",
centerItem: false
}, {
id: 1,
path: "/pages/look/look",
icon: "/static/tab/look.png",
selectIcon: "/static/tab/look_select.png",
text: "展示",
centerItem: false
}, {
id: 2,
path: "/pages/code/code",
icon: "/static/tab/select_add.png",
selectIcon: "/static/tab/select_add.png",
text: "快速",
centerItem: true
}, {
id: 3,
path: "/pages/enter/enter",
icon: "/static/tab/enter.png",
selectIcon: "/static/tab/enter_select.png",
text: "入驻",
centerItem: false
}, {
id: 4,
path: "/pages/my/my",
icon: "/static/tab/my.png",
selectIcon: "/static/tab/my_select.png",
text: "我的",
centerItem: false
}],
};
},
mounted() {
this.tabId = this.currentPage;
//隐藏原生tab
uni.hideTabBar();
},
created() {
// 判断为 iPhone X 给予底部距离
let that = this
uni.getSystemInfo({
success: function(res) {
if (res.model.indexOf('iPhone X') !== -1) {
that.isIpx = true;
}
}
})
},
methods: {
// tab 切换
changeItem(item) {
if (item.id == 2) {
console.log('点击中间' + '快速');
} else {
uni.switchTab({
url: item.path,
});
}
},
}
}
</script>
<style scoped>
view {
padding: 0;
margin: 0;
box-sizing: border-box;
}
.tabbar-container {
position: fixed;
bottom: 0;
left: 0;
width: 100%;
/* height: 100rpx; */
box-shadow: 0 0 5px #999;
display: flex;
align-items: center;
padding: 5rpx 0;
color: #999999;
background-color: #FFFFFF;
}
.tabbar-container .tabbar-item {
width: 20%;
height: 100rpx;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
text-align: center;
}
.tabbar-container .item-active {
color: #f5cb2b;
}
.tabbar-container .center-item {
display: block;
position: relative;
}
.tabbar-container .tabbar-item .item-top {
width: 70rpx;
height: 70rpx;
padding: 5rpx;
}
.tabbar-container .center-item .item-top {
flex-shrink: 0;
width: 130rpx;
height: 130rpx;
position: absolute;
top: -67rpx;
left: calc(50% - 70rpx);
border-radius: 50%;
box-shadow: 0 0 5px #999;
background-color: #FFFFFF;
}
.tabbar-container .tabbar-item .item-top image {
width: 100%;
height: 100%;
}
.tabbar-container .tabbar-item .item-bottom {
font-size: 25rpx;
width: 100%;
}
.tabbar-container .center-item .item-bottom {
position: absolute;
bottom: 2rpx;
}
/* 适配iPhone X */
.IpxBot {
padding-bottom: 30rpx !important;
}
</style>
2.3 mian.js中全局导入
//tabBar组件
import tabBar from 'components/tabbar/tabbar.vue'
Vue.component('tabBar', tabBar)
2.4 页面中调用
<template>
<view>
<!-- 底部 导航栏 currentPage 当前页面ID -->
<tab-bar :currentPage="0"></tab-bar>
</view>
</template>
<script>
//导入组件
import tabBar from '@/components/tabbar/tabbar.vue'
export default {
data() {
return {
};
},
components:{
tabBar
},
methods: {}
};
</script>
3️⃣ 自定义文字图标样式
这个是在原生的基础上,去掉文字显示,改为图片里面自带文字,相当于list里面就一个图片,这个时候自定义宽高,样式在图片里面自定义就可以了,可以使用任何的样式,自己跳跳间距就能完美自定义样式了。
**示例(
注:这几个都是图片
)**
tabBar代码
- iconWidth:可以自定义宽度
- borderStyle:边框颜色
- 注意图片需要两种类型,
一种是选择前,一种是选择后
,然后因为文字放到图片里面了,需要注意文字的大小,图片的外边间距等等,细节调整。
"tabBar": {
"color":"#8a8a8a",
"selectedColor":"#13227A",
"borderStyle":"black",
"backgroundColor":"#ffffff",
"iconWidth": "30px",
"list": [
{
"pagePath":"pages/cultivate/cultivate",
"iconPath":"static/px.png",
"selectedIconPath":"static/px_on.png"
},
{
"pagePath":"pages/test/test",
"iconPath":"static/test.png",
"selectedIconPath":"static/test_on.png"
},
{
"pagePath":"pages/index/index",
"iconPath":"static/xuexi.png",
"selectedIconPath":"static/xuexi_on.png"
},
{
"pagePath":"pages/exchange/exchange",
"iconPath":"static/jl.png",
"selectedIconPath":"static/jl_on.png"
},
{
"pagePath":"pages/me/me",
"iconPath":"static/me.png",
"selectedIconPath":"static/me_on.png"
}
]
}
原创路上,
不积跬步,无以至千里;不积小流,无以成江海。
💞 关注博主 带你实现畅游前后端
🏰 加入社区 带你体验马航不孤单
💯 神秘个人简介 带你体验不一样得介绍
🎀 酷炫邀请函 带你体验高大上得邀请
亲,码字不易,动动小手,欢迎 **点赞 ➕ 收藏**,如 🈶 问题请留言(评论),博主看见后一定及时给您答复,💌💌💌
版权归原作者 xcLeigh 所有, 如有侵权,请联系我们删除。