赞
踩
效果展示:
效果描述:
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上部的类型选项。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。