uniapp 左右滑动切换页面并切换tab

这篇具有很好参考价值的文章主要介绍了uniapp 左右滑动切换页面并切换tab。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实现效果如图

uniapp 左右滑动切换页面并切换tab,uni-app

要实现底部内部的左右滑动切换带动上方tab栏的切换,并且下方内容要实现纵向滚动 ,所以需要swiper,swiper-item,scroll-view组合使用

tab栏部分

<view class="tabs">
				<view class="tab_item" v-for="(item,index) in tabList" :key="index" @click="tabSwitch(item,index)">
					<view class="tab_name" :class="activeTab==index?'act_name':''">{{item.name}}</view>
					<view class="tab_cover" v-if="activeTab!=index"></view>
					<image v-else :src="getimg('leaderboard_toggle.png')" style="width: 30rpx;height: 11rpx;"></image>
				</view>
			</view>

 tab栏点击切换,需要重新调取数据

tabSwitch(item, index) {
				this.scrollTop = 0
				this.activeTab = index
				// this.dataList = []
				this.getData()
			},

下方内容部分

<swiper class="data_list" @change="swipeIndex" :current="activeTab"
		 :duration="300" previous-margin="0" :style="{ height: (pageHeight-205)+'px' }" :circular="true">
			<swiper-item v-for="(val,idx) in tabList" :key="idx">
				<scroll-view v-if="dataList.length>0" scroll-y="true" :style="{ height: (pageHeight-205)+'px' }"
					:scroll-top="scrollTop">
					<view style="padding-bottom: 100rpx;">
						<view class="data_item" :class="index*1+1<4?'act_item'+(index*1+1):''"
							v-for="(item,index) in dataList" :key="index" @click="goDetail(item,index)">
							<view class="le">
								<image :src="getimg('Leaderboard_'+(index*1+1)+'.png')" mode="heightFix"
									style="height: 112rpx;"></image>
								<view class="item_content">{{item.idea_name}}</view>
							</view>
							<view class="like_num">{{item.likecount}}</view>
						</view>

					</view>
				</scroll-view>
				<view v-else class="data_none" :style="{ height: (pageHeight-205)+'px' }">
					<image :src="getimg('null-page.png')" style="width: 380rpx;height: 380rpx;"></image>
					<view class="nothing">空空如也~</view>
				</view>
			</swiper-item>
		</swiper>

滑动切换,改变上方tab栏状态,并重新调取数据

swipeIndex(e){
				this.activeTab = e.detail.current
				this.scrollTop = 0
				this.getData()
			}

以上即可实现页面左右滑动切换带动tab栏切换

但是,上面这种方式适合tab栏目比较少,内容列表也比较短的情况,如果tab栏项目很多,内容数据也很多,用swiper做切换会很卡顿,这个官方地址也有介绍swiper | uni-app官网
uniapp 左右滑动切换页面并切换tab,uni-app

我懒得去研究怎么去优化他,不过这个博主的优化方式很厉害,可以借鉴一下,附上地址: 

uni-app swiper数量过多时卡顿优化方案_uniapp swiper卡顿_菜鸟驿站2020的博客-CSDN博客 

所以当数据很多时,我使用了touch事件加动画的方式做切换

如图,tab栏选项很多,内容列表数据也很多

uniapp 左右滑动切换页面并切换tab,uni-app

 

tabs部分

<view class="tab_box">
				<view style="max-width: 600rpx;height:80rpx ;">
					<u-tabs :list="tabsList" :current="actTab" keyName="category_name" @click="tabSwitch" lineWidth="20"
						lineHeight="4" lineColor="#000000"
						:activeStyle="{color: '#000000',fontWeight: 'bold',transform: 'scale(1.4)'}"
						:inactiveStyle="{color: '#666666',transform: 'scale(1.2)'}"></u-tabs>
				</view>
				<view class="more" @click="cateShow = true">
					<image :src="getimg('originality_label.png')" style="width: 50rpx;height: 50rpx;"></image>
				</view>
            </view>

列表部分

<view class="data_list" @touchstart="touchStart" @touchend="touchEnd" :animation="animationData" 
			:style="{ height: (pageHeight-(marginTop*1+65))+'px' }">
				<scroll-view scroll-y="true" :style="{ height: (pageHeight-(marginTop*1+65))+'px' }"
					@scrolltolower="getBottom" :lower-threshold="80" :scroll-top="scrollTop">
					<view v-if="dataList.length>0" style="padding-bottom: 100rpx;">
						<view class="data_item" v-for="(item,index) in dataList" :key="index"
							@click="goDetail(item,index)">
							<view class="data_top">
								<image :src="getimg('originality_quote.png')" style="width: 64rpx;height: 64rpx;">
								</image>
								<view class="data_content">{{item.idea_name}}</view>
								<view class="lab_box" v-if="item.tag_list && item.tag_list.length>0">
									<view class="lab_item" v-for="(val,idx) in item.tag_list" :key="idx">
										{{val.tag_name}}
									</view>
								</view>
								<view class="times">{{item.updatetime | getDateDiff}}</view>
							</view>
							<view class="data_bot">
								<view class="share" @click.stop="goShare(item,index)">
									<image :src="getimg('share_gray.png')" style="width: 36rpx;height: 36rpx;"></image>
									<view class="share_tt">分享</view>
								</view>

								<view class="infos">
									<view class="comm">
										<image :src="getimg('review_gray.png')" style="width: 44rpx;height: 44rpx;">
										</image>
										<view class="comm_num">{{item.comment_count}}</view>
									</view>
									<view class="comm" @click.stop="addLike(item,index)">
										<image :src="item.is_like?getimg('like_red.png'):getimg('like_gray.png')"
											style="width: 44rpx;height: 44rpx;"></image>
										<view class="comm_num">{{item.like_count}}</view>
									</view>
								</view>
							</view>
						</view>
					</view>
					<view v-else class="data_none" :style="'margin-top:'+(marginTop*1+150)+'px;'">
						<image :src="getimg('null-page.png')" style="width: 380rpx;height: 380rpx;"></image>
						<view class="nothing">空空如也~</view>
					</view>
				</scroll-view>
			</view>

 如代码所以,我使用了touchstart,和touchend事件,并且加了:animation="animationData"

            data(){
                return{
                     scrollTop: 0,
				    startX: 0,
				    startY: 0,
				    animationData: {}, // 动画
                }
               


            }

onLoad中需要先创建动画实例 

onLoad() {
			uni.getSystemInfo({
				success: res => {
					this.pageHeight = res.windowHeight;
				}
			})
			// #ifdef MP-WEIXIN
			const systemInfo = wx.getSystemInfoSync();
			const res = wx.getMenuButtonBoundingClientRect();
			this.height = (res.top - systemInfo.statusBarHeight) * 2 + res.height
			this.marginTop = this.height + systemInfo.statusBarHeight
			// #endif
			
			// 创建动画实例
			this.animation = uni.createAnimation({
				timingFunction: 'ease',
				duration: 120
			})
		},

touchend结束事件中计算手指滑动距离,判断滑动方向并重新调用接口加载数据,并且在判断完滑动方向之后加动效,不让左右滑动看起来生硬

touchStart(event) {
				this.startX = event.touches[0].pageX;
				this.startY = event.touches[0].pageY;
			},
			touchEnd(event) {
				let deltaX = event.changedTouches[0].pageX - this.startX;  
				let deltaY = event.changedTouches[0].pageY - this.startY;
				if (Math.abs(deltaX) > Math.abs(deltaY) && Math.abs(deltaX)>60) {
					if (deltaX < 0) { //往左
						if (this.actTab == this.tabsList.length - 1) {
							this.actTab = 0
						} else {
							this.actTab = this.actTab * 1 + 1
						}
						this.cate_id = this.tabsList[this.actTab].id
						// 动画:左出右进
						this.animation.translateX('-100%').step()
							.opacity(0).step({
								duration: 10
							})
							.translateX('100%').step({
								duration: 10
							})
							.translateX(0).opacity(1).step()
						
						this.animationData = this.animation.export()
						setTimeout(() => {
							this.animationData = {}
						}, 250)
						this.dataList = []
						this.page = 1
						this.getData()
						this.goJust()  //scrollTop改为0
					} else if (deltaX > 0) { //往右
						if (this.actTab == 0) {
							this.actTab = this.tabsList.length - 1
						} else {
							this.actTab = this.actTab * 1 - 1
						}
						this.cate_id = this.tabsList[this.actTab].id
						// 动画:右出左进
						this.animation.translateX('100%').step()  //先横向向右移至100%,即整块移没
							.opacity(0).step({    //再使滑块部分透明
								duration: 10
							})
							.translateX('-100%').step({   //然后趁透明横向向左移至-100%
								duration: 10
							}).translateX(0).opacity(1).step() //接着横向向右移动至初始位置并恢复透明度
						
						this.animationData = this.animation.export()
						// 为避免uniapp动画只有第一次生效,必须延迟删除动画实例数据
						setTimeout(() => {
							this.animationData = {}
						}, 250)
						this.dataList = []
						this.page = 1
						this.getData()
						this.goJust()  //scrollTop改为0
					} else { // 挪动距离0
						
					}
				}else{
					
				}
			},

最后一步,因为内容包裹在scroll-view里,所以触底加载下一页写在scroll-view的触底事件里@scrolltolower="getBottom"

getBottom() {
				if (this.page < this.last_page) {
					this.page += 1
					this.getData()
				}
			},

 文章来源地址https://www.toymoban.com/news/detail-640673.html

到了这里,关于uniapp 左右滑动切换页面并切换tab的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • uniapp实现tabs切换(可滑动)

    继续加油呀~

    2024年02月11日
    浏览(43)
  • 微信小程序———同一页面内左右滑动切换内容显示

    一、微信小程序事件  由于首先介绍一下微信小程序中的事件,可选择快速略过或者直接进去之后的重点内容 一、什么是事件 事件是视图层到逻辑层的通讯方式。 事件可以将用户的行为反馈到逻辑层进行处理。 事件可以绑定在组件上,当达到触发事件,就会执行逻辑层中对

    2024年02月03日
    浏览(73)
  • 微信小程序实现左右滑动进行切换数据页面(touchmove)

    手指触摸左右滑动进行切换数据 需要实现的是有一个tab栏,点选某一个tab的时候切换页面,手势滑动,左滑右滑效果和点击tab一样切换页面数据。 这里我们要先了解几个微信的事件属性 touchstart : 手指触摸动作开始 touchmove:手指触摸后移动 touchcancel:手指触摸动作被打断,

    2024年02月11日
    浏览(69)
  • uniapp-微信小程序实现swiper左右滚动切换tab,上下滚动加载列表

    思路:左右滑动使用swiper,上下滑动用scroll-view,swiper改变时同时改变tab并更新列表 坑点: 1. swiper高度问题,导致滑动不到最底部和最顶部         需要手动计算,减去顶部高度和底部tabbar,并且需要同时设置padding-top和paddin-botton,否则列表显示不完整 2. 由于最开始的代码

    2024年02月04日
    浏览(64)
  • 鸿蒙 ArkTS Tabs组件实现类微信(可滑动的)tabBar页签切换页面功能

    :harmonyOS   鸿蒙开发  ArkTS  TabContent 使用场景:类微信底部导航栏,点击/左右滑动切换页面并加载数据 开发环境:ArkTS3.1  API9  Phone设备 HMOS Dev官方文档:文档中心 演示效果: 目录 完整Demo已提交至Gitee 搭建页面 自定义TabContent(往后翻有完整代码) 思路 开始 完

    2024年02月04日
    浏览(59)
  • uni-app:单页面的页面切换

    2024年02月07日
    浏览(62)
  • 【uni-app】【01】底部导航栏与页面切换

    1.(配置文件在哪)uni-app 路由控制是在 pages.json 文件中的。 2.(基本配置项有哪些)初学的时候主要有三个配置项,① pages ② globalStyle ③ tabbar [!TOC] 接下来主要是对这三个配置项做一个简单介绍。 负责页面管理。不需要自己写的,你在项目的 pages 文件夹下创建页面会自动生成配

    2023年04月27日
    浏览(58)
  • uni-app:切换页面刷新,返回上一页刷新(onShow钩子函数的使用)

    切换页面刷新:通过onShow()便可实现 返回上一页通过uni.navigateBack({delta: 1});实现 以返回上一页刷新为例 在A页面写入方法refreshHandler() 在A页面写入onLoad(),onShow()  onLoad(): 首次进入页面时执行的方法,这里直接引入refreshHandler() 可以直接查询到页面数据 onShow(): 进入页面执行

    2024年02月15日
    浏览(64)
  • 【uni-app教程】四、UniAPP 路由配置及页面跳转

    uni-app 页面路由为框架统一管理,开发者需要在pages.json里配置每个路由页面的路径及页面样式。类似小程序在 app.json 中配置页面路由一样。所以 uni-app 的路由用法与 Vue Router 不同,如仍希望采用 Vue Router 方式管理路由,可在插件市场搜索 Vue-Router。 uni-app 有两种页面路由跳转

    2024年01月16日
    浏览(77)
  • 【UniApp】-uni-app-项目实战页面布局(苹果计算器)

    经过前面的文章介绍,基本上 UniApp 的内容就介绍完毕了 那么从本文开始,我们就开始进行一个项目的实战 这次做的项目是苹果计算器,这个项目的难度不是很大,但是也不是很简单,适合练手 打开 HBuilderX,点击左上角 文件 - 新建 - 项目 : 项目创建完毕之后,首先来分析

    2024年02月04日
    浏览(67)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包