当前位置: 首页 > news >正文

vue3滚动到顶部钩子函数+组件简单示例

1.滚动到顶部钩子函数

import { debounce } from 'lodash-es'
import { nextTick, onMounted, onUnmounted, Ref, ref } from 'vue'const useScrollToTop = (scrollRef: Ref) => {const showButton = ref(false)const handleScroll = (event: any) => {showButton.value = event.srcElement.scrollTop > 300}const scrollToTop = () => {if (scrollRef.value) {scrollRef.value.scrollTo({top: 0,behavior: 'smooth'})}}const initScroll = () => {const dom = scrollRef.valueif (dom) {dom.addEventListener('scroll', debounce(handleScroll, 200), true)}}// 添加滚动事件监听器onMounted(() => {nextTick(() => {initScroll()})})// 移除滚动事件监听器onUnmounted(() => {const dom = scrollRef.valuedom && dom.removeEventListener('scroll', handleScroll)})return {showButton,scrollToTop}
}export default useScrollToTop

2.在回到顶部按钮使用钩子函数:

<template><div class="return-to-top-container"><div v-show="showButton" @click="scrollToTop" class="return-to-top-button"><van-icon name="arrow-up" color="#fff" /><van-icon class="up-icon-2" name="arrow-up" color="#fff" /></div></div>
</template><script lang="ts" setup>
import { Ref, toRefs } from 'vue'
import useScrollToTop from '../hooks/useScrollToTop'const props = defineProps<{scrollRef: Ref
}>()
const { scrollRef } = toRefs(props)
const { showButton, scrollToTop } = useScrollToTop(scrollRef)
</script><style lang="less" scoped>
.return-to-top-container {position: fixed;bottom: 20px;right: 20px;z-index: 9999999999999;
}.return-to-top-button {display: flex;flex-direction: column;justify-content: center;align-items: center;width: 30px;height: 30px;border: none;border-radius: 50%;background-color: rgba(#3498db, 0.5);color: rgba(#fff, 0.5);transition: background-color 0.3s ease;cursor: pointer;
}.up-icon-2 {margin-top: -7px;
}
</style>

3.直接在页面使用(只展示核心部分):

<template><div class="career-page"><HeaderMenu class="header-menu" :menus="menus" @handle-menu="handleMenu" /><div class="flex-1" ref="scrollRef"><router-view /></div></div>
</template><script setup lang="ts">
import HeaderMenu from './HeaderMenu2.vue'
import useScrollToTop from './useScrollToTop'const menus = [...菜单数组略...]
// 加到滚动元素上
const scrollRef = ref()
const { scrollToTop } = useScrollToTop(scrollRef)const handleMenu = (name: string) => {// 回到顶部scrollToTop()
}
</script>

继续加滚动到顶部按钮:

<template><div class="career-page"><HeaderMenu class="header-menu" :menus="menus" @handle-menu="handleMenu" /><div class="flex-1" ref="scrollRef"><ScrollToTopButton :scrollRef="scrollRef" /><router-view /></div></div>
</template><script setup lang="ts">
import HeaderMenu from './HeaderMenu2.vue'
import ScrollToTopButton from './ScrollToTopButton.vue'
import useScrollToTop from './useScrollToTop'const menus = [...菜单数组略...]
// 加到滚动元素上
const scrollRef = ref()
const { scrollToTop } = useScrollToTop(scrollRef)const handleMenu = (name: string) => {// 回到顶部scrollToTop()
}
</script>

4.如果是爷孙组件,可以使用provide提供数据,inject接收数据,再使用钩子函数

深层父级页面provide:

<template><div class="career-page"><HeaderMenu class="header-menu" :menus="menus" @handle-menu="handleMenu" /><div class="flex-1" ref="scrollRef"><ScrollToTopButton :scrollRef="scrollRef" /><router-view /></div></div>
</template><script setup lang="ts">
import { provide } from 'vue'
import HeaderMenu from './HeaderMenu2.vue'
import ScrollToTopButton from './ScrollToTopButton.vue'
import useScrollToTop from './useScrollToTop'const menus = [...菜单数组略...]
// 加到滚动元素上
const scrollRef = ref()
provide('scrollRef ', scrollRef)
const { scrollToTop } = useScrollToTop(scrollRef)const handleMenu = (name: string) => {// 回到顶部scrollToTop()
}
</script>

深层子级页面inject,使用下面的钩子:

import { useRouter } from 'vue-router'
import useXStore from '@/x-store'
import { isMobileEnv } from '@/utils'
import { inject } from 'vue'
import useScrollToTop from './useScrollToTop'const useDetail= () => {const router = useRouter()const xStore = useXStore()const scrollRef = inject<any>('scrollRef')const { scrollToTop } = useScrollToTop(scrollRef)const gotoOther = () => {scrollToTop()router.push({path: '/other',query: {a: '1111'}})xStore.setActiveTab('other')}return {gotoOther,}
}
export default useDetail

http://www.dtcms.com/a/390197.html

相关文章:

  • Linux 开发工具(3)
  • Hive 运行
  • PPT中为图片添加透明渐变的蒙版
  • 数字签名过程中的消息摘要和加密的作用
  • Unity物理系统笔记
  • 区分同步(Synchronous)和异步(Asynchronous)
  • 隐语开源隐私计算SecretFlow,实测性能提升10倍,纵向联邦SecureBoost算法(已开源)
  • 云南食品安全管理员考试都考哪些知识点
  • AAAI2025 | 视觉语言模型 | 西电等提出少样本语言驱动多模态分类模型DiffCLIP
  • Coze(扣子)零基础开发02-建一个简单机器人
  • 混合架构(SpringCloud+Dubbo)的整合方案与适用场景(三)
  • SPI 通信协议
  • vue3学习日记(十六):路由配置详解
  • 河南省 ERA5 日值气象数据处理教程(2020–2025)
  • 继承和多态常见面试问题解析
  • 博士生如何进行文献阅读和文献整理?
  • 矩阵分析线性表示例题
  • OpenEuler---jumpserver堡垒机部署
  • STM32 驱动 MAX31865 读取 PT100 温度方案
  • 第四次编程记录
  • 2024年7月 自旋散射效应
  • 理解神经网络中的批量数据处理:维度、矩阵乘法与广播机制
  • UDP传输大数据?真的能兼顾速度和可靠性吗?
  • 某税网登录逆向-sm2-HMacSHA256-sm4-滑块
  • HashMap 添加元素put()的源码和扩容方法resize()的源码解析
  • Windows系统如何查看SSH公钥?
  • 苹果软件代码混淆与多框架应用加固 iOS混淆、ipa文件安全、跨端应用安全防护全流程指南
  • 第一章 神经网络的复习:神经网络的推理
  • MinIO 4 节点集群部署实战:RPM 安装 + mc 工具攻略(网站托管、自动备份)
  • 支持向量机 SVM 预测人脸数据集时数据是否标准化的对比差异