uni tabs组件,tab选项卡滑动切换

效果展示:

效果描述:

1.tabs点击和左右切换滑动,

2.uni框架,思路是找寻存在的tab组件,发现uni组件库没有

参考链接:uniapp实现tab选项卡 

核心思路:

技术背景:

uni框架,基于vue2语法

完整代码:

<template>
	<view class="content">
		<view class="head">
			<view class="my_information">
				<view class="name">
					<view class="toBack"></view>
					<view class="title_name">设备状态监控</view>
					<view class="ship_change">
						<uni-data-select v-model="shipGuid" :localdata="shipList" @change="changeShip"
							placeholder="请选择船舶"></uni-data-select>
					</view>
				</view>
				<scroll-view class="scroll-view_H" scroll-x="true" scroll-with-animation>
					<view class="modules_titles">
						<view class="lists" v-for="(item, index) in modelList" :key="index"
							:class="currentIndex == index ? 'module_active' : ''" @click="changeModules(index)">
							{{ item.name }}
						</view>
					</view>
				</scroll-view>
			</view>
		</view>
		<!-- <view class="modules_content">
			<view class="modules_components">
				<component :is="currentComponents"></component>
			</view>
		</view> -->
		<!-- 选项卡内容轮播滑动显示,current为当前第几个swiper子项 -->
		<swiper @change="change" :current="isActive" class="modules_content">
			<swiper-item class="swiperitem-content">
				<scroll-view scroll-y style="height: 100%;">
					<view class="nav_item">
						<block>
							<view class="echart_box">
								<pieChart :option="hostOpt1" echartsId="IndexA" height="300rpx"></pieChart>
							</view>
							<view class="echart_box"
								style="width: 100%;display: flex;justify-content: space-evenly;align-items: center;">
								<view class="termp_home">
									<view class="title">左滑油温度</view>
									<pieChart :option="hostOpt2" echartsId="IndexB" height="300rpx"></pieChart>
								</view>
								<view class="termp_home">
									<view class="title">右滑油温度</view>
									<pieChart :option="hostOpt22" echartsId="Indexb" height="300rpx"></pieChart>
								</view>
							</view>
							<view class="echart_box" style="margin-top: 30rpx;">
								<pieChart :option="hostOpt3" echartsId="IndexC" height="300rpx"></pieChart>
							</view>
						</block>
					</view>
				</scroll-view>
			</swiper-item>
			<swiper-item class="swiperitem-content">
				<scroll-view scroll-y style="height: 100%;">
					<view class="nav_item">
						<block>
							<view class="echart_box"
								style="width: 100%;display: flex;justify-content: space-evenly;align-items: center;">
								<view class="termp_home">
									<view class="title">左淡水排温温度</view>
									<pieChart :option="hostOpt2" echartsId="IndexD" height="300rpx"></pieChart>
								</view>
								<view class="termp_home">
									<view class="title">右淡水排温温度</view>
									<pieChart :option="hostOpt22" echartsId="Indexd" height="300rpx"></pieChart>
								</view>
							</view>
							<view class="echart_box"
								style="width: 100%;display: flex;justify-content: space-evenly;align-items: center;">
								<view class="termp_home">
									<view class="title">左淡水进温温度</view>
									<pieChart :option="hostOpt22" echartsId="IndexE" height="300rpx"></pieChart>
								</view>
								<view class="termp_home">
									<view class="title">右淡水进温温度</view>
									<pieChart :option="hostOpt22" echartsId="Indexe" height="300rpx"></pieChart>
								</view>
							</view>
							<view class="echart_box"
								style="width: 100%;display: flex;justify-content: space-evenly;align-items: center;">
								<view class="termp_home">
									<view class="title">左排烟管排气温度</view>
									<view class="container">
										<block v-for="(item, index) in 2" :key="index">
											<view class="item">
												<div class="item_xuhao">#{{ index + 1 }}</div>
												<div class="item_right">
													<div class="num">50.5</div>
													<div class="unit">゜C</div>
												</div>
											</view>
										</block>
									</view>
								</view>
								<view class="termp_home">
									<view class="title">右排烟管排气温度</view>
									<view class="container">
										<block v-for="(item, index) in 2" :key="index">
											<view class="item">
												<div class="item_xuhao">#{{ index + 1 }}</div>
												<div class="item_right">
													<div class="num">50.5</div>
													<div class="unit">゜C</div>
												</div>
											</view>
										</block>
									</view>
								</view>
							</view>
						</block>
					</view>
				</scroll-view>
			</swiper-item>
			<swiper-item class="swiperitem-content">
				<scroll-view scroll-y style="height: 100%;">
					<view class="nav_item">
						<block>
							<view class="echart_box">
								<pieChart :option="altOpt1" echartsId="AltA" height="300rpx"></pieChart>
							</view>
							<view class="echart_box"
								style="width: 100%;display: flex;justify-content: space-evenly;align-items: center;">
								<view class="termp_home">
									<view class="title">左排温温度</view>
									<pieChart :option="altOpt2" echartsId="AltB" height="300rpx"></pieChart>
								</view>
								<view class="termp_home">
									<view class="title">右排温温度</view>
									<pieChart :option="altOpt22" echartsId="Altb" height="300rpx"></pieChart>
								</view>
							</view>
							<view class="echart_box" style="margin-top: 30rpx;">
								<pieChart :option="altOpt3" echartsId="AltC" height="300rpx"></pieChart>
							</view>
						</block>
					</view>
				</scroll-view>
			</swiper-item>
			<swiper-item class="swiperitem-content">
				<scroll-view scroll-y style="height: 100%;">
					<view class="nav_item">
						<block>
							<view class="echart_box">
								<pieChart :option="rudOpt1" echartsId="RudderA" height="300rpx"></pieChart>
							</view>
							<view class="echart_box"
								style="width: 100%;display: flex;justify-content: space-evenly;align-items: center;">
								<view class="termp_home">
									<view class="title">左液压油温度</view>
									<pieChart :option="rudOpt2" echartsId="RudderB" height="300rpx"></pieChart>
								</view>
								<view class="termp_home">
									<view class="title">右液压油温度</view>
									<pieChart :option="rudOpt22" echartsId="Rudderb" height="300rpx"></pieChart>
								</view>
							</view>
							<view class="echart_box" style="margin-top: 30rpx;">
								<pieChart :option="rudOpt3" echartsId="RudderC" height="300rpx"></pieChart>
							</view>
						</block>
					</view>
				</scroll-view>
			</swiper-item>
			<swiper-item class="swiperitem-content">
				<scroll-view scroll-y style="height: 100%;">
					<view class="nav_item">
						<block>
							<view class="echart_box">
								<pieChart :option="rudOpt4" echartsId="RudderD" height="300rpx"></pieChart>
							</view>
							<view class="echart_box"
								style="width: 100%;display: flex;justify-content: space-evenly;align-items: center;">
								<view class="termp_home">
									<view class="title">左滑油温度</view>
									<pieChart :option="rudOpt5" echartsId="RudderE" height="300rpx"></pieChart>
								</view>
								<view class="termp_home">
									<view class="title">右滑油温度</view>
									<pieChart :option="rudOpt55" echartsId="Ruddere" height="300rpx"></pieChart>
								</view>
							</view>
							<view class="echart_box" style="margin-top: 30rpx;">
								<pieChart :option="rudOpt6" echartsId="RudderF" height="300rpx"></pieChart>
							</view>
						</block>
					</view>
				</scroll-view>
			</swiper-item>
			<!-- <swiper-item class="swiperitem-content">
				<scroll-view scroll-y style="height: 100%;">
					<view class="nav_item">
						另一个页面
					</view>
				</scroll-view>
			</swiper-item> -->
		</swiper>
	</view>
</template>
<script>
import host from "@/components/IndexComponents/host.vue"
import alternator from "@/components/IndexComponents/alternator.vue"
import rudder from "@/components/IndexComponents/rudder.vue"
import store from '@/store/index.js'
import pieChart from '@/components/graph/pieChart.vue';
import { pieSpeed, tempBar } from "@/utils/chart.js"

export default {
	components: {
		host,
		alternator,
		rudder,
		pieChart,
	},
	data() {
		return {
			currentIndex: 0,//选中的设备类型
			isActive: 0,//选中的swiper
			// currentComponents: "host",
			modelList: [
				{
					name: "主机状态",
					components: "host",
				},
				{
					name: "发电机状态",
					components: "alternator",
				},
				{
					name: "舵桨轴系",
					components: "rudder",
				},
			],
			shipGuid: "",
			shipList: [],
			//主机
			hostOpt1: {},
			hostOpt2: {},
			hostOpt22: {},
			hostOpt3: {},
			//发电机
			altOpt1: {},
			altOpt2: {},
			altOpt22: {},
			altOpt3: {},
			//舵桨轴系
			rudOpt1: {},
			rudOpt2: {},
			rudOpt22: {},
			rudOpt3: {},
			rudOpt4: {},
			rudOpt5: {},
			rudOpt55: {},
			rudOpt6: {},
		}
	},
	created() {
		this.getApiData()
	},
	methods: {
		// 当前点击子元素靠左留一个选项展示,子元素宽度不相同也可实现
		changeModules(index) {
			// this.currentIndex = index;
			// this.currentComponents = this.modelList[index].components
			switch (index) {
				case 0:
					this.isActive = 0
					break;
				case 1:
					this.isActive = 2
					break;
				case 2:
					this.isActive = 3
					break;
				default:
					this.isActive = 0
					break;
			}
		},
		changeShip() {
			console.log(11, this.shipGuid)
			this.$store.commit('setShipGuids', this.shipGuid);
		},
		// swiper滑动时,获取其索引,也就是第几个
		change(e) {
			const { current } = e.detail;
			this.isActive = current;
		},
		getApiData() {
			console.log('api parseInt(1000/10)>>>', parseInt(3000 / 10));
			let host1 = [
				{ title: '左主机转速', name: 'r/min', value: 890, unit: '', pos: ['25%', '50%'], rangeMax: 1200 },
				{ title: '右主机转速', name: 'r/min', value: 890, unit: '', pos: ['75%', '50%'], rangeMax: 1200 },
			]
			let host3 = [
				{ title: '左增压器转速', name: 'r/min', value: 890, unit: '', pos: ['25%', '50%'], rangeMax: 1200 },
				{ title: '右增压器转速', name: 'r/min', value: 890, unit: '', pos: ['75%', '50%'], rangeMax: 1200 },
			]
			let luProps = {
				title: '31.2゜C',
				TP_max: 80,
				TP_min: 20,
				TP_value: 30,
				kdtop: 135,
				grids: {
					xgrid: "40%",
					chartGrid: -17,
					kdGrid: -7,
				}
			}
			this.hostOpt1 = pieSpeed(host1)
			this.hostOpt2 = tempBar(luProps)
			this.hostOpt22 = tempBar(luProps)
			this.hostOpt3 = pieSpeed(host3)
			let alt1 = [
				{ title: '左发电机转速', name: 'r/min', value: 890, unit: '', pos: ['25%', '50%'], rangeMax: 1200 },
				{ title: '右发电机转速', name: 'r/min', value: 890, unit: '', pos: ['75%', '50%'], rangeMax: 1200 },
			]
			let alt2 = [
				{ title: '左启动空气压力', name: 'MPa', value: 0.60, unit: '', pos: ['25%', '50%'], rangeMax: 1 },
				{ title: '右启动空气压力', name: 'MPa', value: 0.65, unit: '', pos: ['75%', '50%'], rangeMax: 1 },
			]
			this.altOpt1 = pieSpeed(alt1)
			this.altOpt2 = tempBar(luProps)
			this.altOpt22 = tempBar(luProps)
			this.altOpt3 = pieSpeed(alt2)
			let rud1 = [
				{ title: '左桨角', name: 'r/min', value: 890, unit: '', pos: ['25%', '50%'], rangeMax: 1200 },
				{ title: '右桨角', name: 'r/min', value: 890, unit: '', pos: ['75%', '50%'], rangeMax: 1200 },
			]
			let rud3 = [
				{ title: '左舵桨转速', name: 'r/min', value: 890, unit: '', pos: ['25%', '50%'], rangeMax: 1200 },
				{ title: '右舵桨转速', name: 'r/min', value: 890, unit: '', pos: ['75%', '50%'], rangeMax: 1200 },
			]
			this.rudOpt1 = pieSpeed(rud1)
			this.rudOpt2 = tempBar(luProps)
			this.rudOpt22 = tempBar(luProps)
			this.rudOpt3 = pieSpeed(rud3)
			let rud4 = [
				{ title: '左舵桨中间轴转速', name: 'r/min', value: 890, unit: '', pos: ['25%', '50%'], rangeMax: 1200 },
				{ title: '右舵桨中间轴转速', name: 'r/min', value: 890, unit: '', pos: ['75%', '50%'], rangeMax: 1200 },
			]
			let rud6 = [
				{ title: '左滑油压力', name: 'r/min', value: 0.62, unit: '', pos: ['25%', '50%'], rangeMax: 1 },
				{ title: '右滑油压力', name: 'r/min', value: 0.62, unit: '', pos: ['75%', '50%'], rangeMax: 1 },
			]
			this.rudOpt4 = pieSpeed(rud1)
			this.rudOpt5 = tempBar(luProps)
			this.rudOpt55 = tempBar(luProps)
			this.rudOpt6 = pieSpeed(rud3)
		},
	},
	mounted() {
		this.shipGuid = store.state.shipGuids
		this.shipList = store.state.shipLists
	},
	watch: {
		// swiper与上面选项卡联动
		isActive(newval) {
			// this.currentIndex = newval;
			switch (newval) {
				case 0:
					this.currentIndex = 0
					break;
				case 1:
					this.currentIndex = 0
					break;
				case 2:
					this.currentIndex = 1
					break;
				case 3:
					this.currentIndex = 2
					break;
				case 4:
					this.currentIndex = 2
					break;
				default:
					this.currentIndex = 0
					break;
			}
		},
	},
}
</script>
<style lang="scss" scoped>
page {
	height: 100%;
	display: flex;
	background-color: #FFFFFF;
}

.content {
	width: 100%;
	// height: calc(100vh - 50px);
	flex: 1;
	// background-image: url("@/static/head_bg.png");
	// background-size: 100% 388rpx;
	// background-repeat: no-repeat;
	display: flex;
	flex-direction: column;

	.head {
		width: 100%;
		height: 230rpx;
		// height: 21%;
		padding: 0 40rpx 0;
		color: #FFFFFF;
		box-sizing: border-box;
		background-image: url("@/static/head_bg.png");
		background-size: 100% 388rpx;
		background-repeat: no-repeat;

		.my_information {
			width: 100%;
			height: 230rpx;
			font-size: 36rpx;
			text-align: center;
			padding-top: 50rpx;
			left: 0;
			background: none;
			z-index: 200;

			.name {
				width: 100%;
				display: flex;
				justify-content: space-between;
				align-items: center;

				.ship_change {
					width: 200rpx;

					/deep/.uni-select {
						border: none;

						.uni-select__input-placeholder {
							color: #fff;

						}

						.uni-icons::before {
							// display: none;
							color: #fff;
						}

						.uni-select__selector-item {
							color: #000;
						}

						.uni-select__input-text {
							color: #fff;
						}

						.uni-select__selector {
							z-index: 1000;
						}
					}
				}

				.toBack {
					width: 200rpx;

				}
			}

			.scroll-view_H {
				white-space: nowrap;
				width: 100%;
			}

			.modules_titles {
				display: flex;
				justify-content: space-between;
				margin-top: 30rpx;
				font-weight: 500;
				font-size: 28rpx;

				.lists {
					width: 172rpx;
					height: 60rpx;
					line-height: 60rpx;
					text-align: center;
				}

				.module_active {
					background: #FFFFFF;
					border-radius: 98rpx;
					color: #0C274F;
				}
			}
		}

		
	}

	.modules_content {
		width: 100%;
		flex: 1;

		.modules_components {
			height: 100%;
			background: #FFFFFF;
			min-height: 1000rpx;
			padding: 38rpx 20rpx 0rpx;
			box-sizing: border-box;
		}

		.swiperitem-content {
			background-color: #ffffff;

			.nav_item {
				background-color: #FFFFFF;
				padding: 20rpx 40rpx 0rpx 40rpx;
				height: 100%;
				display: flex;
				flex-direction: column;
				justify-content: space-around;
				align-items: center;
			}
		}
	}
}
</style>
 

写在最后,实现思路总结:

uni组件库没有tabs选项卡组件,只有自己封装,实现的思路:
考虑分为上下两块,上部是类型切换绑定点击事件,下部之前用动态组件,下部改为swiper组件,并绑定change事件。
swiper组件的属性current绑定第几个swiper-item子项,并且watch监听绑定值,对这个绑定值处理和上部的类型对应上(也可不处理)。

不处理的情况是:一个swiper-item对应一个tabs上部的类型选项。 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值