uniapp 滚动tab

uniapp + woui +unibest

<route lang="json5">{style: {navigationBarTitleText: '知识产权',navigationBarBackgroundColor: '#C80F06',navigationBarTextStyle: 'white',backgroundColorTop: '#C80F06',},}
</route>
<template><view class="bgc-b w100"><!-- 导航栏 --><NavTabScroll:tabs="tabs":current-tab="currentTab":scroll-left="scrollLeft":show-nav-bar="showNavBar"@update:currentTab="handleTabClick"/><scroll-viewclass="content-scroll"id="my-scroll":scroll-y="true":scroll-x="false":scroll-into-view="currentAnchor":scroll-top="scrollTop":scroll-with-animation="true"@scroll="handleScroll"><view class="section" id="patent"><SubTitle:title="tabs[0].title":toggleName="tabs[0].key":show="patentParam.show"ref="title1"@toggle="handleToggle('patent')"></SubTitle><viewclass="sec_item"v-for="(item, index) in patentList":key="index"v-show="patentParam.show"><Patent :data="item"></Patent></view><view class="load-more-list"><!-- v-if="+patentParam.totalCount > patentList.length" --><view class="load-more-btn" @click="handleViewMore('patent')"><text>查看更多</text></view><view class="is-loading" v-if="patentParam.loading"><text>加载中</text></view></view></view><view class="section" id="brand"><SubTitle:title="tabs[1].title":toggleName="tabs[1].key":show="brandParam.show"ref="title1"@toggle="handleToggle('brand')"></SubTitle><viewclass="sec_item"v-for="(item, index) in brandList":key="index"v-show="brandParam.show"><Brand :data="item"></Brand></view><view class="load-more-list"><!-- v-if="+brandParam.totalCount > brandList.length" --><view class="load-more-btn" @click="handleViewMore('brand')"><text>查看更多</text></view><view class="is-loading" v-if="brandParam.loading"><text>加载中</text></view></view></view><view class="section" id="softwareCopyright"><SubTitle:title="tabs[2].title":toggleName="tabs[2].key":show="showBrand"ref="title1"@toggle="handleToggle('softwareCopyright')"></SubTitle><viewclass="sec_item"v-for="(item, index) in softwareCopyrightList":key="index"v-show="softwareCopyrightParam.show"><SoftwareCopyright :data="item"></SoftwareCopyright></view><view class="load-more-list"><!-- v-if="+softwareCopyrightParam.totalCount > softwareCopyrightParam.length" --><view class="load-more-btn" @click="handleViewMore('softwareCopyright')"><text>查看更多</text></view><view class="is-loading" v-if="softwareCopyrightParam.loading"><text>加载中</text></view></view></view><view class="section" id="workCopyright"><SubTitle:title="tabs[3].title":toggleName="tabs[3].key":show="workCopyrightParam.show"ref="title1"@toggle="handleToggle('workCopyright')"></SubTitle><viewclass="sec_item"v-for="(item, index) in workCopyrightList":key="index"v-show="workCopyrightParam.show"><WorkCopyright :data="item"></WorkCopyright></view><view class="load-more-list"><!-- v-if="+workCopyrightParam.totalCount > workCopyrightList.length" --><view class="load-more-btn" @click="handleViewMore('workCopyright')"><text>查看更多</text></view><view class="is-loading" v-if="workCopyrightParam.loading"><text>加载中</text></view></view></view><view class="section" id="network"><SubTitle:title="tabs[4].title":toggleName="tabs[4].key":show="networkParam.show"ref="title1"@toggle="handleToggle('network')"></SubTitle><viewclass="sec_item"v-for="(item, index) in networkList":key="index"v-show="networkParam.show"><Network :data="item"></Network></view><view class="load-more-list"><!-- <viewclass="load-more-btn"v-if="+networkParam.totalCount > networkList.length"@click="handleViewMore('network')"><text>查看更多</text></view> --><view class="is-loading" v-if="networkParam.loading"><text>加载中</text></view></view></view></scroll-view></view>
</template><script lang="ts" setup>
import { ref, onMounted, nextTick, onUnmounted, computed } from 'vue'
import { debounce } from '@/uni_modules/wot-design-uni/components/common/util'
import {listPatentApplicationListAll,listTrademarkListAll,listSoftwareCopyrightInfoAll,listCopyrightInfoAll,listWebsiteInfoAll,
} from '@/api/enterprise'
import NavTabScroll from '@/components/NavTabScroll/NavTabScroll.vue' //滚动锚点组件
import SubTitle from '@/components/Property/title.vue'
import Patent from '@/components/Property/patent.vue'
import Brand from '@/components/Property/brand.vue'
import SoftwareCopyright from '@/components/Property/softwareCopyright.vue'
import WorkCopyright from '@/components/Property/workCopyright.vue'
import Network from '@/components/Property/network.vue'const tabs = [{ key: 'patent', title: '专利', top: 0 },{ key: 'brand', title: '商标', top: 0 },{ key: 'softwareCopyright', title: '软件著作权', top: 0 },{ key: 'workCopyright', title: '作品著作权', top: 0 },{ key: 'network', title: '网络备案', top: 0 },
]
const scrollLeft = ref(0)
const showNavBar = ref(true)
const currentTab = ref('patent')
const currentAnchor = ref('')
const scrollTop = ref(0)const id = ref(null)const topList = ref([])const patentList = ref([])
const patentParam = ref({applicationDate: '',applicationNumber: [],companyId: '960f87c242e8ad867a066cbaa5f78e1',companyName: '',name: '',pageNo: 0,pageSize: 0,publicationDate: '',totalCount: 0,totalPage: 0,loading: false,show: true,
})const brandList = ref([])
const brandParam = ref({appDate: '',companyId: '960cf87c242e8ad867a066cbaa5f78e1',companyName: '',flowStatusDesc: '',intClsDesc: '',name: '',pageNo: 1,pageSize: 5,regDate: '',totalCount: 0,totalPage: 0,loading: false,show: true,
})const softwareCopyrightList = ref([])
const softwareCopyrightParam = ref({companyId: '848f94014224e0999b52c45e02ad1164',companyName: '',name: '',pageNo: 1,pageSize: 5,registerAperDate: '',totalCount: 0,totalPage: 0,loading: false,show: true,
})
const workCopyrightList = ref([])
const workCopyrightParam = ref({companyId: 'a6faee7453d06561b7e6bb6cc3235c4f',companyName: '',pageNo: 1,pageSize: 5,registerDate: '',totalCount: 0,totalPage: 0,loading: false,show: true,
})const networkList = ref([])
const networkParam = ref({companyId: '95113c19bd54fee0155438311aac5af6',companyName: '',pageNo: 1,pageSize: 5,totalCount: 0,totalPage: 0,loading: false,show: true,
})onLoad((options) => {id.value = options.companyId// 如果有 currentTab 参数,设置初始标签并滚动if (options.currentTab) {currentTab.value = options.currentTab}// networkParam.value.companyId = id.valuePromise.all([getPatent(), getBrand(), getSoftware(), getWorkCopyright(), getNetwork()]).then((res) => {setTimeout(() => {calcPosition()currentAnchor.value = options.currentTab}, 400)},)
})
function getPatent() {return new Promise((resolve) => {const params = JSON.parse(JSON.stringify(patentParam.value))delete params.totalCountdelete params.totalPagedelete params.loadingdelete params.showpatentParam.value.loading = truelistPatentApplicationListAll(params).then((res) => {if (res.status === '0') {if (res.data && res.data.length) {patentList.value = [...patentList.value, ...res.data]}patentParam.value.totalCount = +res.totalCount || 0patentParam.value.totalPage = +res.totalPage || 0}resolve(patentList.value)}).finally(() => {patentParam.value.loading = false})})
}
function getBrand() {return new Promise((resolve) => {const params = JSON.parse(JSON.stringify(brandParam.value))delete params.totalCountdelete params.totalPagedelete params.loadingdelete params.showbrandParam.value.loading = truelistTrademarkListAll(params).then((res) => {if (res.status === '0') {if (res.data && res.data.length) {brandList.value = [...brandList.value, ...res.data]}brandParam.value.totalCount = +res.totalCount || 0brandParam.value.totalPage = +res.totalPage || 0}resolve(brandList.value)}).finally(() => {brandParam.value.loading = false})})
}
function getSoftware() {return new Promise((resolve) => {const params = JSON.parse(JSON.stringify(softwareCopyrightParam.value))delete params.totalCountdelete params.totalPagedelete params.loadingdelete params.showsoftwareCopyrightParam.value.loading = truelistSoftwareCopyrightInfoAll(params).then((res) => {if (res.status === '0') {if (res.data && res.data.length) {softwareCopyrightList.value = [...softwareCopyrightList.value, ...res.data]}softwareCopyrightParam.value.totalCount = +res.totalCount || 0softwareCopyrightParam.value.totalPage = +res.totalPage || 0}resolve(softwareCopyrightList.value)}).finally(() => {softwareCopyrightParam.value.loading = false})})
}
function getWorkCopyright() {return new Promise((resolve) => {const params = JSON.parse(JSON.stringify(workCopyrightParam.value))delete params.totalCountdelete params.totalPagedelete params.loadingdelete params.showworkCopyrightParam.value.loading = truelistCopyrightInfoAll(params).then((res) => {if (res.status === '0') {if (res.data && res.data.length) {workCopyrightList.value = [...workCopyrightList.value, ...res.data]}workCopyrightParam.value.totalCount = +res.totalCount || 0workCopyrightParam.value.totalPage = +res.totalPage || 0}resolve(workCopyrightList.value)}).finally(() => {workCopyrightParam.value.loading = false})})
}function getNetwork() {return new Promise((resolve) => {const params = JSON.parse(JSON.stringify(networkParam.value))delete params.totalCountdelete params.totalPagedelete params.loadingdelete params.shownetworkParam.value.loading = truelistWebsiteInfoAll(params).then((res) => {if (res.status === '0') {if (res.data && res.data.length) {networkList.value = [...networkList.value, ...res.data]}networkParam.value.totalCount = +res.totalCount || 0networkParam.value.totalPage = +res.totalPage || 0}resolve(networkList.value)}).finally(() => {networkParam.value.loading = false})})
}function handleToggle(type) {if (type === 'patent') {patentParam.value.show = !patentParam.value.show} else if (type === 'brand') {brandParam.value.show = !brandParam.value.show} else if (type === 'softwareCopyright') {softwareCopyrightParam.value.show = !softwareCopyrightParam.value.show} else if (type === 'workCopyright') {workCopyrightParam.value.show = !workCopyrightParam.value.show} else if (type === 'network') {networkParam.value.show = !networkParam.value.show}setTimeout(() => {calcPosition()}, 300)
}async function handleTabClick(key: string, index: number) {currentTab.value = keycurrentAnchor.value = key
}// 一进入页面且数据渲染完成后 或 展开收起的时候判断 页面元素的高度
function calcPosition() {const query = uni.createSelectorQuery()query.select('.content-scroll').boundingClientRect()tabs.forEach((key) => {query.select(`#${key.key}`).boundingClientRect()})query.exec((res) => {// 第一个参数是外层滚动框距离顶部的高度topList.value = res.map((item) => {return item.top})tabs.map((item, index) => {item.top = topList.value[index + 1] - topList.value[0]})})
}// 滚动判断高度
function handleScroll(e: any) {debouncedScrollEnd(e)
}const debouncedScrollEnd = debounce(async (e) => {const scrollTop = e.detail.scrollTop// 遍历sectionTops,找到当前所在的sectionfor (let i = 0; i < tabs.length; i++) {if (scrollTop >= tabs[i].top && scrollTop <= tabs[i + 1].top && i < tabs.length - 1) {currentTab.value = tabs[i].keybreak} else if (i === tabs.length - 1) {// 最后一个元素currentTab.value = tabs[i - 1].keybreak}}
}, 500)// 随机颜色生成
function getRandomColor(index: number): string {const colors = ['#53C89C','#4EBCDE','#2E8AF0','#588BEA','#6875E4','#9370DB','#FC9682','#F5A882','#F8BF7F','#F5D678','#63D5D2',]return colors[index % colors.length]
}function handleViewMore(type) {uni.navigateTo({url: `/pages-sub/property/${type}?companyId=${id.value}`,})
}
</script>
<style lang="scss" scoped>
.section {background: #fff;margin-bottom: 16rpx;
}
.content-scroll {height: calc(100vh - 30rpx);
}
</style>

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

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

相关文章

日事清驾驶舱模式上线:实时数据更新+项目管理+数据可视化,提升决策效率​

大家好&#xff01;我们在日事清最新更新中推出了一个令人激动的新功能——驾驶舱模式。这一全新界面将为企业管理者和团队提供一个全面、实时的数据展示平台。下面&#xff0c;让我们详细了解这个功能如何帮助您更好地把握企业动态和提升决策效率。 快速入口&#xff1a;一键激…

【Maven】Maven深度避坑指南:依赖冲突全维度解决方案与工业级实战(超万字解析)

注&#xff1a;本文基于50大型企业级项目经验&#xff0c;结合Maven底层源码机制&#xff0c;系统化解决依赖冲突问题。包含20个实战场景、10类特殊案例及5大防御体系构建方案。 Maven深度避坑指南&#xff1a;依赖冲突全维度解决方案与工业级实战&#xff08;超万字解析&#…

Rust Web 全栈开发(二):构建 HTTP Server

Rust Web 全栈开发&#xff08;二&#xff09;&#xff1a;构建 HTTP Server Rust Web 全栈开发&#xff08;二&#xff09;&#xff1a;构建 HTTP Server创建成员包/库&#xff1a;httpserver、http解析 HTTP 请求HTTP 请求的构成构建 HttpRequest 构建 HTTP 响应HTTP 响应的构…

小架构step系列01:小架构初衷

1 概述 小公司做业务服务&#xff0c;需要聚焦到实际的业务上&#xff0c;尽快通过业务服务客户&#xff0c;给客户创建价值&#xff0c;公司才能生存下去。在技术上采用的Web应用架构具备以下特点&#xff1a; 主要由开源组件组装而成。这样既可以节省成本&#xff0c;也可以把…

苹果AR/VR头显路线图曝光,微美全息推进AI/AR智能眼镜新品开启视觉体验篇章

日前&#xff0c;郭明錤发表了一篇关于苹果&#xff08;AAPL.US&#xff09;2025-2028头戴式产品路线图的文章&#xff0c;里面提到苹果正在开发涵盖MR头显、AI眼镜、AR眼镜、Birdbath眼镜等共计7款设备。 苹果的头显设备中&#xff0c;大量出货的产品是类似于Ray-Ban Meta的智…

python pyecharts 数据分析及可视化(2)

一、任务要求 任务二&#xff1a;感冒高发期分析 【任务说明】 感冒是一种常见的急性上呼吸道病毒性感染性疾病&#xff0c;多由鼻病 毒、副流感病毒、呼吸道合胞病毒、埃可病毒、柯萨奇病毒、冠状病 毒、腺病毒等引起。临床表现为鼻塞、喷嚏、流涕、发热、咳嗽、头 痛等&#…

React自学 基础一

React基础 React 是一个由 Facebook&#xff08;现 Meta&#xff09;开发并维护的、开源的 JavaScript 库&#xff0c;主要用于 构建用户界面&#xff08;UI&#xff09;&#xff0c;尤其是单页面应用程序中的动态、交互式界面。 简单示例&#xff1a; import React, { useSt…

PHP语法基础篇(八):超全局变量

超全局变量是在 PHP 4.1.0 中引入的&#xff0c;并且是内置变量&#xff0c;可以在所有作用域中始终可用。 PHP 中的许多预定义变量都是"超全局的"&#xff0c;这意味着它们在一个脚本的全部作用域中都可用。在函数或方法中无需执行 global $variable; 就可以访问它们…

NumPy-核心函数concatenate()深度解析

NumPy-核心函数concatenate深度解析 一、concatenate()基础语法与核心参数函数签名与核心作用基础特性&#xff1a;形状匹配规则 二、多维数组拼接实战示例1. 一维数组&#xff1a;最简单的序列拼接2. 二维数组&#xff1a;按行与按列拼接对比按行拼接&#xff08;垂直方向&…

aws(学习笔记第四十八课) appsync-graphql-dynamodb

aws(学习笔记第四十八课) appsync-graphql-dynamodb 使用graphql来方便操作dynamodb 理解graphql中的graphql api&#xff0c;schema&#xff0c;resolver 学习内容&#xff1a; graphqlgraphql apischemaresolver 1. 代码连接和修改 1.1 代码链接 代码链接&#xff08;app…

关于微前端框架micro,子应用设置--el-primary-color失效的问题

设置了manualChunks导致失效,去掉即可,比较小众的问题 下面是deepseek的分析 关于 manualChunks 导致 Element Plus 主题变量失效的问题 你找到的确实是问题的关键所在。这个 manualChunks 配置影响了 Element Plus 样式和变量的加载顺序&#xff0c;从而导致主题变量失效。…

MySQL 学习 之 你还在用 TIMESTAMP 吗?

目录 1. 弊端1.1. 取值范围1.2. 时区依赖1.3. 隐式转换 2. 区别3. 解决 1. 弊端 1.1. 取值范围 TIMESTAMP 的取值范围为 1970-01-01 00:00:01 UTC 到 2038-01-19 03:14:07 UTC&#xff0c;超出范围的数据会被强制归零或触发异常‌。 具体表现为在基金债券等业务中&#xff0…

java中字节和字符有何区别,为什么有字节流和字符流?

在Java中&#xff0c;字节&#xff08;byte&#xff09;和字符&#xff08;char&#xff09;是两种不同的数据类型&#xff0c;它们的主要区别在于所表示的数据单位、用途以及编码方式,字节流和字符流的区分就是为了解决编码问题。 字节&#xff08;byte&#xff09;&#xff…

伴随矩阵 线性代数

伴随矩阵的定义 伴随矩阵的作用是什么&#xff1f;我们可以看到其伴随矩阵乘上自己等于一个数&#xff08;自身的行列式&#xff09;乘以E&#xff0c;所以对于一个方阵来说&#xff0c;其逆矩阵就是自己的伴随矩阵的倍数。 所以说伴随矩阵的作用就是用来更好的求解逆矩阵的。…

百胜软件获邀走进华为,AI实践经验分享精彩绽放

在数字化浪潮席卷全球的当下&#xff0c;零售行业正经历着深刻变革&#xff0c;人工智能技术成为重塑行业格局的关键力量。6月26日&#xff0c;“走进华为——智领零售&#xff0c;AI赋能新未来”活动在华为练秋湖研发中心成功举办。百胜软件作为数字零售深耕者&#xff0c;携“…

六种扎根理论的编码方法

一、实境编码 1.概念&#xff1a;实境编码是一种基于参与者原生语言的质性编码方法&#xff0c;其核心在于直接采用研究对象在访谈、观察或文本中使用的原始词汇、短语或独特表达作为分析代码。该方法通过保留数据的"原生态"语言形式&#xff08;如方言、隐喻、习惯用…

【Spring篇09】:制作自己的spring-boot-starter依赖1

文章目录 1. Spring Boot Starter 的本质2. Starter 的模块结构&#xff08;推荐&#xff09;3. 制作 xxx-spring-boot-autoconfigure 模块3.1 添加必要的依赖3.2 编写具体功能的配置类3.3 编写自动化配置类 (AutoConfiguration)3.4 注册自动化配置类 (.imports 或 spring.fact…

Qt6之qml自定义控件开发流程指南

Qt6之qml自定义控件开发流程指南 &#x1f6e0;️ 一、基础控件创建 定义 QML 文件 在工程中新建 QML 文件&#xff08;如 CustomButton.qml&#xff09;&#xff0c;文件名首字母大写。 使用基础组件&#xff08;如 Rectangle、Text&#xff09;构建控件逻辑&#xff0c;通过…

Vue简介,什么是Vue(Vue3)?

什么是Vue&#xff1f; Vue是一款用于构建用户界面的JavaScript框架。 它基于标准HTML、CSS和JavaScript构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。无论是简单的还是复杂地界面&#xff0c;Vue都可以胜任。 声明式渲染…

从零开始构建Airbyte数据管道:PostgreSQL到BigQuery实战指南

作为数据工程师&#xff0c;ETL&#xff08;Extract, Transform, Load&#xff09;流程是日常工作的核心。然而&#xff0c;构建和维护数据管道往往耗时且复杂。幸运的是&#xff0c;开源工具Airbyte提供了一种更便捷的解决方案——它支持350预构建连接器&#xff0c;允许通过无…