UniAPP怎么实现tabbar滑动切换

UniAPP是一款基于Vue.js开发框架的全端开发工具,它可以将代码编译到不同的平台,例如安卓、IOS、H5以及小程序等等。在UniAPP中,tabbar是常用组件,用来实现各项功能的切换。而本篇文章就将着重讲解UniAPP中如何实现tabbar的滑动切换。

一、tabbar基础组件

在UniAPP中,实现tabbar需要借助uni-ui的tabbar组件,该组件是基于uni-icons图标库和自定义图标集的封装,所以在使用前还需要在App.vue中引入uni-icons图标库。接下来,我们可以在static中自定义图标,代码如下所示:

{

"path": "/pages/index/index",

"style": {

"navigationBarTitleText": "首页",

"app-plus": {

"bounce": "none"

}

},

"usingComponents": {

"uni-tabbar": "/components/uni-tabbar/uni-tabbar.vue",

"uni-tabbar-item": "/components/uni-tabbar-item/uni-tabbar-item.vue"

},

"disableScroll": true,

"tabBar": {

"color": "#999999",

"selectedColor": "#F56C6C",

"backgroundColor": "#FFFFFF",

"borderStyle": "white",

"list": [{

"pagePath": "/pages/index/index",

"iconPath": "/static/index.png",

"selectedIconPath": "/static/index_active.png",

"text": "首页"

}, {

"pagePath": "/pages/list/list",

"iconPath": "/static/list.png",

"selectedIconPath": "/static/list_active.png",

"text": "列表"

}, {

"pagePath": "/pages/mine/mine",

"iconPath": "/static/mine.png",

"selectedIconPath": "/static/mine_active.png",

"text": "我的"

}]

}

}

代码解析:

- tabBar:是一个对象,用来设置tabBar的样式和内容。

- color:未选中标签的颜色。

- selectedColor:选中标签的颜色。

- backgroundColor:背景色。

- borderStyle:边框样式,现在未设置。

- list:是一个数组,每一项表示一个tabBar选项。

二、实现滑动切换

现在我们已经知道如何使用tabBar组件,接下来让我们来实现滑动切换。UniAPP中可以利用一个功能强大的组件uni-transition,这个组件提供了丰富的CSS3动画效果,而且还可以自定义动画效果。在实现滑动切换中,我们可以通过设置tabBar的样式和结合uni-transition组件,实现一个简单、美观、实用的滑动效果。

1. 设置样式

首先,在global.scss文件中设置tabBar的样式:

.tab-bar {

position: fixed;

bottom: 0;

left: 0;

right: 0;

display: flex;

background-color: #ffffff;

height: 50px;

z-index: 999;

.tab-bar-item {

flex-grow: 1;

display: flex;

flex-direction: column;

align-items: center;

justify-content: center;

color: #606266;

&.active {

color: #F56C6C;

.uni-img {

animation: aniImg .8s ease-in-out both;

}

}

.uni-img {

width: 25px;

height: 25px;

}

.uni-number {

line-height: 1.5;

font-size: 12px;

padding: 2px 4px;

border-radius: 8px;

background-color: #F56C6C;

color: #ffffff;

margin-left: -10px;

}

}

}

代码解析:

- .tab-bar:设置tabBar的样式,使其居底固定。

- .tab-bar-item:设置tabBar-item的样式,flex-grow使每个item均占一定比例。

- &.active:设置选中状态下的样式,可以用来添加动画。

- .uni-img:图片样式。

- .uni-number:数字样式。

2. 编写滑动效果组件

接下来,我们来编写滑动效果组件。代码如下所示:

<template>

<div class="swiper">

<div class="swiper-list">

<slot></slot>

</div>

</div>

</template>

<script>

export default {

props: {

currentIndex: {

type: Number,

default: 0

}

},

watch: {

currentIndex(value) {

this.scroll(value)

}

},

mounted() {

this.scroll(this.currentIndex)

},

methods: {

scroll(i) {

let gallary = this.$refs.swiperList

let galleryWidth = gallary.offsetWidth

let offset = i * galleryWidth

uni.createSelectorQuery().in(this).select('.swiper-list').scrollLeft(offset).exec()

}

}

}

</script>

<style scoped>

.swiper {

overflow: hidden;

background-color: #ffffff;

.swiper-list {

display: flex;

flex-wrap: nowrap;

transition: all .3s;

}

}

</style>

代码解析:

- currentIndex:表示当前选中的tabBarItem的项数,默认是第1项。

- watch:监听currentIndex属性的改变,并触发scroll方法。

- mounted:组件挂载完成后,执行scroll方法,使该组件滑到正确的位置。

- scroll:滑动方法,根据currentIndex计算出偏移量offset,然后使用uni.createSelectorQuery().in(this).select('.swiper-list').scrollLeft(offset).exec()方法来滑动到指定位置。

- .swiper:父盒子,用来包裹所有的子盒子。overflow: hidden用来将子盒子设置为固定高度,防止tabBar内容过多时出现纵向滚动条。background-color: #ffffff设置背景色为白色。

- .swiper-list:是真实的盒子,用来包裹所有的子盒子。display: flex;flex-wrap: nowrap;是强制所有的子盒子水平排列的。

- transition: all 0.3s;是为了加入一个过渡效果。

3. 利用swiper组件实现滑动

在uni-ui中能够使用强大的swiper组件来实现滑动效果。实现方法与前文类似,只需在相应页面的template中添加swiper组件即可。

<template>

<div>

<uni-tabbar :show="true" :index="0"></uni-tabbar>

<map :id="'map' + tabActive"></map>

<swiper :currentIndex="tabActive" ref="mySwiper">

<swiper-item>

<div class="my-page">

<h2>第一页的内容</h2>

...

</div>

</swiper-item>

<swiper-item>

<div class="my-page">

<h2>第二页的内容</h2>

...

</div>

</swiper-item>

<swiper-item>

<div class="my-page">

<h2>第三页的内容</h2>

...

</div>

</swiper-item>

</swiper>

</div>

</template>

<script>

import uniTabBar from "@/components/uni-tabbar/uni-tabbar.vue";

import swiper from "@/components/swiper/swiper.vue";

import swiperItem from "@/components/swiper/swiper-item.vue";

export default {

components: {

uniTabBar,

swiper,

swiperItem

},

data() {

return {

tabActive: 0,

markers: [] // 地图marker数组

};

},

methods: {

switchTab(index) {

this.tabActive = index;

this.$refs.mySwiper.scroll(index);

}

}

};

</script>

<style scoped>

.my-page {

height: 800rpx;

}

</style>

代码解析:

- swiper:是一个vue组件,需要在template中引入。

- swiper-item:是swiper组件中的一个子组件,表示一个子页面。注意:在无法确定swiper-item的数量时可以使用v-for动态生成。

- switchTab:tabBar的点击事件函数,在点击不同的tabBar-item时修改tabActive的值并调用$this.refs.mySwiper.scroll(index)方法来滑动到相应的页面。

三、总结

本文介绍了如何在UniAPP中实现tabbar的滑动切换,通过示例演示了具体的操作步骤。在实现滑动效果中,借助uni-transition和swiper组件可以非常快速、简单的实现基于tabBar的切换,满足用户的更高需求。希望本文对正在学习UniAPP的小伙伴有所帮助。