vue 开发 滑动页面中出现tabs 并且需要分页的

效果

需求

我们这个页面顶部有tabs 栏 而且可以滑动到底部 进行分页

实现这样的页面我们应该怎么做  你应该会想到scroll-view 这个组件吧

下面我们来详情介绍一下这个页面的实现和功能开发

首先展示一下代码

item  循环项

<template><div class="wechat-order-item-container"><div class="box"><div class="header"><div class="cinema-name">金逸影城(安庆星光荟店)</div><div class="status">订单超时</div></div><div class="content"><div class="movie-img"><imagesrc="https://gw.alicdn.com/tfscom/i3/O1CN01s4djbH29FutyK4fzY_!!6000000008039-0-alipicbeacon.jpg_300x300.jpg"style="width: 90px; border-radius: 5px"mode="widthFix"></image></div><div class="movie-data"><div class="name marginTop">我们一起摇太阳</div><div class="time marginTop">2024-04-15 21:30:00</div><div class="hall marginTop color858a99">4号激光厅</div><div class="address marginTop color858a99">宜秀区独秀大道安庆星光荟第四层</div><div class="seat marginTop color858a99">4排六座</div></div><div class="right"><div class="city">安庆市</div><div class="num">共1张</div><div class="price">¥45.00</div></div></div><div class="footer"><div class="timer">创建时间:2024-04-15 17:34</div><div class="btn"><nut-buttonplaintype="default"size="small"style="border: 1px solid #eee">订单详情</nut-button></div></div></div></div>
</template>
<script setup></script>
<style lang="scss">
.wechat-order-item-container {background-color: #fff;padding: 20px 25px;font-size: 26px;border-radius: 15px;.box {.header {color: #858a99;padding-bottom: 20px;display: flex;align-items: center;justify-content: space-between;border-bottom: 1px solid #f7f8f9;.cinema-name {}.status {font-size: 24px;}}.content {padding: 20px 0;border-bottom: 1px solid #f7f8f9;display: flex;.right {flex: 1;margin-left: 20px;display: flex;flex-direction: column;align-items: center;.city {color: #15181d;font-weight: 700;}.num {}.price {color: #028fd4;}}.movie-data {margin-left: 20px;.marginTop {margin-top: 5px;}.color858a99 {color: #858a99;}.name {font-size: 26px;color: #15181d;font-weight: 700;}.time {color: #028fd4;}}}.footer {margin-top: 15px;display: flex;justify-content: space-between;align-items: center;.timer {color: #858a99;font-size: 24px;}}}
}
</style>

这个算是 每一个item的代码 我把他封装成了一个组件

tabs 栏

<template><div class="filter-container"><nut-tabs v-model="selected" title-scroll type="smile" title-gutter="10"><nut-tab-pane v-for="item in tabList" :title="item.name"></nut-tab-pane></nut-tabs></div>
</template>
<script setup>
import { ref, watch, toRefs } from "vue";
const props = defineProps({tabList: Array,
});
const emit = defineEmits(["onChange"]);
const { tabList } = toRefs(props);
const selected = ref(0);//监听当前的tabs选中 变化出发自定一函数 子传父组件数据
watch(selected, (index) => {emit("onChange", tabList.value[index]);
});
</script>
<style lang="less">
.filter-container {.nut-tabs__content {display: none !important;}.nut-tabs__list {background-color: #fff;}.nut-tabs__titles {// background: #ffffff !important;.nut-tabs__titles-item {.nut-tabs__titles-item__smile {display: none;}.nut-tabs__titles-item__text {color: #858a99;font-size: 24px;}.nut-tabs__titles-item__line {background: linear-gradient(to right, #028fd4, #028fd6) !important;}.nut-tabs__titles-item__smile .nut-icon {color: #028fd4 !important;}}.nut-tabs__titles-item.active {.nut-tabs__titles-item__smile {display: block;margin-top: 10px !important;}.nut-tabs__titles-item__text {color: #15181d;}}}
}
</style>

我也把他封装成了一个组件 都是经过二次封装的

这个做法 巧妙的将每一项的item 的上下距离页拉开了

<template><div class="wechat-order-container"><Tabbar></Tabbar><div class="wechat-list" :style="{ marginTop: `${tabbarHeight}` + 'px' }"><Filter :tab-list="tabList" @onChange="handleClickTabs"></Filter><divclass="flex-list":style="{ height: `${listContainerHeight}` + 'px' }"><templatev-if="list.length > 0 && listContainerHeight > 0":style="{ height: `${listContainerHeight}px` }"><scroll-view:scroll-y="true"scrollAnchoring@scrolltolower="onScrollBottom":scroll-top="scrollTop":style="{ height: `${listContainerHeight}` + 'px' }"><div class="flex-item"><Item></Item></div><div class="flex-item"><Item></Item></div><div class="flex-item"><Item></Item></div><div class="flex-item"><Item></Item></div><div class="flex-item"><Item></Item></div><div class="flex-item"><Item></Item></div><div class="flex-item"><Item></Item></div><div class="flex-item"><Item></Item></div><div class="flex-item"><Item></Item></div><div class="flex-item"><Item></Item></div><!-- <Loading:page="pageinfo.currentPage":total="totalpage":loadingFlag="loadingFlag":tipFlag="tipFlag"></Loading> --></scroll-view></template><template v-else><nut-empty description="无数据"></nut-empty></template></div></div></div>
</template>
<script>
import { needLogin } from "../../../utils/needLoginHook";
export default {mixins: [needLogin],
};
</script>
<script setup>
import { onMounted, ref, computed } from "vue";
import Taro, { useDidShow } from "@tarojs/taro";
import { storeToRefs } from "pinia";
import Tabbar from "../../../components/wx-tabbar/index.vue";
import Filter from "./filter.vue";
import { useTabbarStore } from "../../../store";
import Item from "./item.vue";
const tabbarStore = useTabbarStore();
const { selected, tabbarHeight } = storeToRefs(tabbarStore);
onMounted(() => {tabbarStore.setSelected(1);
});
useDidShow(() => {getListContainerHeight();
});
const list = ref([1, 2, 3]);
const scrollTop = ref(0);
const listContainerHeight = ref(0);
const tabList = ref([{id: 0,name: "全部",},{id: 1,name: "已创建",},{id: 2,name: "已支付",},{id: 3,name: "已出票",},{id: 4,name: "已退票",},
]);
//计算当前页面的高度
const getListContainerHeight = () => {const query = Taro.createSelectorQuery().select(".flex-list").boundingClientRect();query.selectViewport();query.exec(function (res) {if (res[0]) {listContainerHeight.value = res[0].height;}});
};
//滑动到底部的执行方法
const onScrollBottom = () => {console.log("到底了");
};
const handleClickTabs = () => {};
</script>
<style lang="scss">
.wechat-order-container {height: 100%;.wechat-list {position: fixed;left: 0;right: 0;bottom: 0;top: 0;display: flex;flex-direction: column;.flex-list {flex: 1;.flex-item {padding: 10px 20px;}}}
}
</style>

主页面的代码

详细介绍

scroll-view 是需要 高度的  这个高度 就是外面盒子的高度

高度计算

const getListContainerHeight = () => {const query = Taro.createSelectorQuery().select(".flex-list").boundingClientRect();query.selectViewport();query.exec(function (res) {if (res[0]) {listContainerHeight.value = res[0].height;}});
};

这个外面的盒子需要去计算 我们计算scroll-view 的高度是和父组件的高度一致得

最后一个注意点

.wechat-list 这个盒子 是需要我们将他变为fixed 的定位 相当于操作就是 属于wechat-list 的了 摆脱了 最外面的大盒子的滑动

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/623131.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构与算法】贪心算法及例题

目录 贪心算法例题一&#xff1a;找零问题例题二&#xff1a;走廊搬运物品最优方案问题输入样例例题三&#xff1a;贪心自助餐 贪心算法 贪心算法是一种在每一步选择中都采取当前状态下最优的选择&#xff0c;以期望最终达到全局最优解的算法。它的核心思想是每次都选择当前最…

zabbix监控服务

一、监控软件的作用 作为一个运维&#xff0c;需要会使用监控系统查看服务器状态以及网站流量指标&#xff0c;利用监控系统的数据去了解上线发布的结果和网站的健康状态 利用一个优秀的监控软件&#xff0c;我们可以&#xff1a; 对系统不间断实时监控实时反馈系统当前状态保…

2024第十五届蓝桥杯JavaB组省赛部分题目

目录 第三题 第四题 第五题 第六题 第七题 第八题 转载请声明出处&#xff0c;谢谢&#xff01; 填空题暂时可以移步另一篇文章&#xff1a;2024第十五届蓝桥杯 Java B组 填空题-CSDN博客 第三题 第四题 第五题 第六题 第七题 第八题 制作不易&#xff0c;还请点个赞支持…

【软件工程】UML用例图介绍和实例说明

文章目录 1、什么是用例图2、用例图的作用3、怎么画用例图4、三要素说明5、实例说明 1、什么是用例图 用例图&#xff08;Use Case Diagram&#xff09;是统一建模语言&#xff08;UML&#xff09;的一种图&#xff0c;它主要用于描述系统的功能和用户&#xff08;参与者&…

实现智能水控 | 基于ACM32 MCU的分体式水控方案

分体式水控概述 分体式水控是一种常见的水控系统&#xff0c;它的工作原理是通过水的流动来控制水的供应和排放&#xff0c;该系统一般由两部分组成&#xff1a;控制器和水阀。控制器负责监测水的流量和压力&#xff0c;根据设定的参数来控制水阀的开和关&#xff0c;从而实现水…

PMP一般需要提前多久备考?

很多考生在备考PMP前都会有这样问题&#xff0c;那么考取PMP需要提前多长时间备考比较合适呢&#xff1f;是两个月&#xff1f;还是三个月&#xff1f;还是四个月&#xff1f; 我觉得因人而异。像有些学霸踏踏实实备考一个半月&#xff0c;每天花个4、5个小时去学习&#xff0…

医疗设备防漏费系统安装的必要性是什么,人情、管理、增收?

医疗漏费新闻 19138173009&#xff08;刘&#xff09; 请大家稍作停留&#xff0c;聚焦网页新闻。那些隐藏在暗处的私收费、人情检查&#xff0c;正是我们这个时代需要警惕的痛点。或许&#xff0c;在网络上&#xff0c;你曾看到过类似的新闻&#xff0c;那些关于抖音上的漏费…

精益管理培训:谁需要它,为什么需要?

当下&#xff0c;精益管理作为一种先进的管理理念和方法&#xff0c;正被越来越多的企业所重视。那么&#xff0c;精益管理培训适合哪些人群呢&#xff1f;天行健精益管理培训公司解析如下&#xff1a; 一、企业中高层管理者 企业中高层管理者是企业战略决策和日常运营的核心力…

单细胞分析|映射和注释查询数据集

reference映射简介 在本文中&#xff0c;我们首先构建一个reference&#xff0c;然后演示如何利用该reference来注释新的查询数据集。生成后&#xff0c;该reference可用于通过cell类型标签传输和将查询cell投影到reference UMAP 等任务来分析其他查询数据集。值得注意的是&am…

vue3 vueUse 连接蓝牙

目录 vueuse安装&#xff1a; useBluetooth: 调用蓝牙API 扫描周期设备 选择设备配对 连接成功 vue3的网页项目连接电脑或者手机上的蓝牙设备&#xff0c;使用vueUse库&#xff0c;可以快速检查连接蓝牙设备。 vueUse库使用参考&#xff1a; VueUse工具库 常用api-CSDN…

【Android】Activity task和Instrumentation杂谈

文章目录 activity taskInstrumentation机制参考 Android不仅可以装载众多的系统组件&#xff0c;还可以将它们跨进程组成ActivityTask&#xff0c;这个特性使得每个应用都不是孤立的。 activity task 从数据结构角度看&#xff0c;Task有先后之分&#xff0c;源码实现上采取了…

苍穹外卖学习记录(二)

本节&#xff0c;主要是学习业务逻辑&#xff0c;我们以菜品管理为例&#xff1a; 在实现这部分前&#xff0c;我们要完成Mybatis的配置&#xff0c;即指定映射的mapper.xml文件路径以及对应的实体类&#xff0c;这部分配置是在application.yml文件中实现的。 mybatis:#mapper…