Vue 3 自定义 Hook:实现页面数据刷新与滚动位置还原

存在一个场景:

在列表页滚动查看某一条卡片时,从卡片进入详情页面后,返回时希望页面能够滚动回原来的卡片位置,而不是顶部或其他位置。应该怎么办呢?

1. 方法简述

1.1 整体流程
  1. 离开页面时:
    • 记录当前滚动位置。
  2. 返回页面时:
    • 判断是否需要刷新数据和还原滚动位置。
    • 如果需要:
      1. 调用指定的刷新方法。
      2. 将滚动位置还原到离开时的值。
1.2 核心处理
import { computed, ref } from 'vue';
export default function useRefreshScroll({fromList,scrollDomRef,queryDomRef = null,queryFn = 'onRefresh',
}) {// 存储离开时的位置const preScrollTop = ref(0);const scrollDom = computed(() => (scrollDomRef.value instanceof HTMLElement ? scrollDomRef.value : scrollDomRef.value?.$el));// 页面进入前判断是否需要还原位置const beforeEnter = async (to, from, next) => {if (fromList.includes(from.name as string)) {const resultQueryDomRef = queryDomRef ?? scrollDomRef;const refreshFn = resultQueryDomRef.value?.[queryFn];if (refreshFn) {await refreshFn();}setTimeout(() => {if (scrollDom.value) {scrollDom.value.scrollTop = preScrollTop?.value;}}, 300); // 观感考虑设置为300}next();};// 记录离开时的位置 scrollTopconst beforeLeave = (to, from, next) => {preScrollTop.value = scrollDom?.value?.scrollTop ?? 0;next();};return {beforeLeave,beforeEnter,};
}
1.3 具体使用方法
<template><div ref="scrollDomRef" class="scroll-container"><!-- 这里是滚动内容 --></div>
</template><script>
import { ref } from 'vue';
import useRefreshScroll from './path/to/useRefreshScroll';export default {name: 'MyComponent',setup() {const scrollDomRef = ref(null); // 滚动容器的 refconst { beforeLeave, beforeEnter } = useRefreshScroll({// 假设从 'home' 或 'profile' 页面跳转过来时需要恢复滚动位置fromList: ['home', 'profile'],scrollDomRef,queryFn: 'onRefresh',});// 这里可以处理路由守卫...return {scrollDomRef,beforeLeave,beforeEnter,};},
};
</script>

2. 方法介绍

作用:根据条件判断是否需要刷新页面数据,并将页面滚动位置恢复到离开时的锚点位置。

参数如下:

/*** @param fromList:Array<string>,页面导航的前置页面 name 列表。如果从这些页面返回,则触发数据刷新和滚动位置恢复逻辑。* @param scrollDomRef:Ref,表示滚动容器的引用,可能是一个 DOM 节点或 Vue 组件实例。* @param queryDomRef:Ref,用于调用数据刷新方法的组件引用,默认值是 scrollDomRef。* @param queryFn:string,需要调用的刷新数据的方法名称,默认是 'onRefresh'。* @return {*}*/

部分代码注释:

1、scrollDom:返回滚动容器的实际 DOM 元素。如果 scrollDomRef.value 是一个 DOM 元素,则直接返回,如果其是 Vue 组件实例,则尝试获取根 DOM 元素(使用 $el )。

const scrollDom = computed(() => (scrollDomRef.value instanceof HTMLElement ? scrollDomRef.value : scrollDomRef.value?.$el)
);

2、beforeEnter 和 beforeLeave Vue Router 的路由守卫

在 beforeEnter 中,首先检查页面是否从某个特定页面(由 fromList 定义)跳转过来。如果是的话,它会检查是否需要执行 onRefresh 等操作,并且在视图渲染后恢复滚动位置。

在 beforeLeave 中,记录了当前页面的滚动位置 scrollTop,以便在进入下一个页面时恢复这个位置。

这两个方法会在 Vue Router 的生命周期钩子 beforeRouteEnter、beforeRouteLeave 中使用。

3、next() 是 Vue Router 生命周期钩子中的回调函数,用来继续路由的生命周期。

eg:在 beforeEnter 和 beforeLeave 调用,通知 Vue Router 继续执行路由切换操作。

总结:

通过 Vue 的响应式 API 和导航守卫,实现了动态刷新与滚动位置恢复的功能,更好的提升用户体验。

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

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

相关文章

循环队列(C语言)

从今天开始我会开启一个专栏leetcode每日一题&#xff0c;大家互相交流代码经验&#xff0c;也当作我每天练习的自我回顾。第一天的内容是leetcode622.设计循环队列。 一、题目详细 设计你的循环队列实现。 循环队列是一种线性数据结构&#xff0c;其操作表现基于 FIFO&#…

Golang Gin系列-1:Gin 框架总体概述

本文介绍了Gin框架&#xff0c;探索了它的关键特性&#xff0c;并建立了简单入门的应用程序。在这系列教程里&#xff0c;我们会探索Gin的主要特性&#xff0c;如路由、中间件、数据库集成等&#xff0c;最终能使用Gin框架构建健壮的web应用程序。 总体概述 Gin是Go编程语言的…

在线宠物用品|基于vue的在线宠物用品交易网站(源码+数据库+文档)

|在线宠物用品交易网站 目录 基于springbootvue的在线宠物用品交易网站 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师&am…

鸿蒙安装HAP时提示“code:9568344 error: install parse profile prop check error” 问题现象

在启动调试或运行应用/服务时&#xff0c;安装HAP出现错误&#xff0c;提示“error: install parse profile prop check error”错误信息。 解决措施 该问题可能是由于应用使用了应用特权&#xff0c;但应用的签名文件发生变化后未将新的签名指纹重新配置到设备的特权管控白名…

图像去雾数据集的下载和预处理操作

前言 目前&#xff0c;因为要做对比实验&#xff0c;收集了一下去雾数据集&#xff0c;并且建立了一个数据集的预处理工程。 这是以前我写的一个小仓库&#xff0c;我决定还是把它用起来&#xff0c;下面将展示下载的路径和数据处理的方法。 下面的代码均可以在此找到。Auo…

React的应用级框架推荐——Next、Modern、Blitz等,快速搭建React项目

在 React 企业级应用开发中&#xff0c;Next.js、Modern.js 和 Blitz 是三个常见的框架&#xff0c;它们提供了不同的特性和功能&#xff0c;旨在简化开发流程并提高应用的性能和扩展性。以下是它们的详解与比较&#xff1a; Next、Modern、Blitz 1. Next.js Next.js 是由 Ve…

内网渗透测试工具及渗透测试安全审计方法总结

1. 内网安全检查/渗透介绍 1.1 攻击思路 有2种思路&#xff1a; 攻击外网服务器&#xff0c;获取外网服务器的权限&#xff0c;接着利用入侵成功的外网服务器作为跳板&#xff0c;攻击内网其他服务器&#xff0c;最后获得敏感数据&#xff0c;并将数据传递到攻击者&#xff0…

Weblogic - General - 弱口令 任意文件读取漏洞

0x01&#xff1a;漏洞简介 首先需要说明&#xff0c;本文并不是介绍了 Weblogic 某一 CVE 漏洞&#xff0c;而是提供了一种通用的测试思路。 0x0101&#xff1a;弱口令漏洞 弱口令漏洞主要是由于用户安全意识淡薄&#xff0c;为了便于记忆&#xff0c;设置了强度过低的密码&…

重温STM32之环境安装

缩写 CMSIS&#xff1a;common microcontroller software interface standard 1&#xff0c;keil mdk安装 链接 Keil Product Downloads 安装好后&#xff0c;开始安装平台软件支持包&#xff08;keil 5后不在默认支持所有的平台软件开发包&#xff0c;需要自行下载&#…

Ceph与RAID在存储中的协同工作过程

本文将结合架构图&#xff0c;详细讲解Ceph与RAID如何在存储环境中相互配合&#xff0c;共同提供高效且可靠的存储服务。 架构概述 从上图中可以看到&#xff0c;Ceph的架构主要分为四个层次&#xff1a; 客户端和服务接口层&#xff1a;这一层包括客户端访问存储应用的接口…

蓝桥杯训练—矩形面积交

文章目录 一、题目二、示例三、解析四、代码 一、题目 平面上有两个矩形&#xff0c;它们的边平行于直角坐标系的X轴或Y轴&#xff0c;对于每个矩形&#xff0c;我们给出它的一对相对顶点的坐标&#xff0c;请你编程写出两个矩形的交的面积 输入格式&#xff1a; 输入包含两行…

GraphRAG: Auto Prompt Tuning 实践

GraphRAG 的 Auto Prompt Tuning 功能是一个强大的工具&#xff0c;用于优化知识图谱的生成过程。以下是对该功能的详细介绍和分析&#xff1a; 自动提示调优&#xff08;Auto Prompt Tuning&#xff09; 1. 概念 GraphRAG 的自动提示调优功能旨在为特定领域的知识图谱生成创…

【设计模式】 单例模式(单例模式哪几种实现,如何保证线程安全,反射破坏单例模式)

单例模式 作用&#xff1a;单例模式的核心是保证一个类只有一个实例&#xff0c;并且提供一个访问实例的全局访问点。 实现方式优缺点饿汉式线程安全&#xff0c;调用效率高 &#xff0c;但是不能延迟加载懒汉式线程安全&#xff0c;调用效率不高&#xff0c;能延迟加载双重检…

IJCAI-2024 | 具身导航的花样Prompts!VLN-MP:利用多模态Prompts增强视觉语言导航能力

作者&#xff1a; Haodong Hong1,2 , Sen Wang1∗ , Zi Huang1 , Qi Wu3 and Jiajun Liu2,1 单位&#xff1a;昆士兰大学&#xff0c;澳大利亚科学与工业研究组织&#xff0c;阿德莱德大学 论文标题&#xff1a;Why Only Text: Empowering Vision-and-Language Navigation wi…

【蓝桥杯选拔赛真题62】C++求和 第十四届蓝桥杯青少年创意编程大赛 算法思维 C++编程选拔赛真题解

目录 C++求和 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、运行结果 五、考点分析 七、推荐资料 C++求和 第十四届蓝桥杯青少年创意编程大赛C++选拔赛真题 一、题目要求 1、编程实现 给定一个正整数N(1<N<10^6),求出N左右相邻两个…

智能创造的幕后推手:AIGC浪潮下看AI训练师如何塑造智能未来

文章目录 一、AIGC时代的算法与模型训练概览二、算法与模型训练的关键环节三、AI训练师的角色与职责四、AI训练师的专业技能与素养五、AIGC算法与模型训练的未来展望《AI训练师手册&#xff1a;算法与模型训练从入门到精通》亮点内容简介作者简介谷建阳 目录 《AI智能化办公&am…

Cloud Foundry,K8S,Mesos Marathon弹性扩缩容特性对比

一、Cloud Foundry 使用Scaling an Application Using App Autoscaler插件&#xff0c;基于资源使用情况触发简单扩缩容 CPU、内存、Http带宽、延时等 监控这些资源的使用情况决定扩缩容策略&#xff1a;实例是增加还是减少 Instance Limits 限制实例数量范围&#xff0c;定义…

ComfyUI 矩阵测试指南:用三种方法,速优项目效果

在ComfyUI中&#xff0c;矩阵测试也叫xyz图表测试&#xff0c;作用是通过控制变量的方式来对Lora模型以及各种参数开展测试&#xff0c;并进行有效区分。其中测试方法有很多种&#xff0c;可以通过借助插件也可以自行搭建工作流实现&#xff0c;下面介绍3种方式&#xff1a; 1…

什么宠物最好养?

在忙碌的生活中&#xff0c;想要拥有一份陪伴&#xff0c;却又担心没时间打理&#xff1f;别怕&#xff0c;今天就来给大家揭秘&#xff0c;什么宠物最好养&#xff0c;让你轻松开启养宠生活&#xff0c;即使再忙也能享受毛孩子带来的快乐&#xff01; 一、仓鼠&#xff1a;萌…

mfc操作json示例

首先下载cJSON,加入项目; 构建工程,如果出现, fatal error C1010: unexpected end of file while looking for precompiled head 在cJSON.c文件的头部加入#include "stdafx.h"; 看情况,可能是加到.h或者是.cpp文件的头部,它如果有包含头文件, #include &…