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

React@16.x(43)路由v5.x(8)常见应用场景(5)- 滚动条复位

目录

  • 1,滚动条复位
  • 2,在 React 中的触发的3种方式
    • 2.1,高阶组件
    • 2.2,useEffect
    • 2.3,路由守卫

1,滚动条复位

因为切换路由,页面并不会刷新,所以需要手动复位滚动条。实现滚动条复位是比较简单的,注意点在于 React 中的触发时机。

滚动条复位实现逻辑:resetScroll.js

let timer1, timer2;export default function resetScroll() {// 先清理,是因为当切换路由后,滚动动画还没有完成时,又切换了路由。此时需要重新开始动画。clearInterval(timer1);clearInterval(timer2);const html = document.documentElement;timer1 = animate(html.scrollTop, 0, (value) => {html.scrollTop = value;});timer2 = animate(html.scrollLeft, 0, (value) => {html.scrollLeft = value;});
}/*** @param {*} start 滚动起始点* @param {*} end 滚动终点(0)* @param {*} callback 计时器每次触发的函数,会传递最新的滚动距离。* @param {*} totalTime 滚动总时间* @returns*/
function animate(start, end, callback, totalTime = 100) {const tick = 16;const times = Math.ceil(totalTime / 16); // 变化次数const distance = (start - end) / times; // 每次运动的距离let curTimes = 0;let timer = setInterval(() => {curTimes++;start -= distance;if (curTimes >= times) {clearInterval(timer);start = end;}callback(start);}, tick);return timer;
}

2,在 React 中的触发的3种方式

2.1,高阶组件

对类组件使用高阶组件封装,并在返回的类组件中的 componentDidMount() 中调用 resetScroll() 即可。不多赘述。

2.2,useEffect

定义一个依赖项为 pathname 的 HOOK 函数,并在目标路由组件中执行即可。

function useScroll(pathname) {useEffect(() => {resetScroll();}, [pathname]);
}

App.jsx

import { BrowserRouter as Router, Route, NavLink } from "react-router-dom";
import { useScroll } from "./hooks";
import "./App.css";function News(props) {useScroll(props.location.pathname);return <div className="page news">News</div>;
}function Goods(props) {useScroll(props.location.pathname);return <div className="page goods">Goods</div>;
}export default function App() {return (<div className="container"><Router><div className="nav-box"><NavLink to="/news">新闻页</NavLink><NavLink to="/goods">商品页</NavLink></div><div className="page-box"><Route path="/news" component={News}></Route><Route path="/goods" component={Goods}></Route></div></Router></div>);
}

App.css

.nav-box {position: fixed;top: 0;margin: 0 auto;height: 50px;
}.nav-box a {display: inline-block;margin: 10px;
}.nav-box a.active {color: salmon;
}.page-box {margin-top: 50px;
}.page {height: 150vh;width: 150vh;
}.page.news {background-color: lightgreen;
}.page.goods {background-color: lightyellow;
}

2.3,路由守卫

上篇文章中介绍了路由守卫。

所以可在路由发生变化时执行 resetScroll() 即可。

export default function App() {return (<div className="container"><RouteGuardonRouteChange={(prevLocation, nextLocation) => {// 因为点击相同路由也会执行,所以增加判断。if (prevLocation.pathname !== nextLocation.nextLocation) {resetScroll();}}}>{/* ... */}</RouteGuard></div>);
}

以上。

相关文章:

  • 0702_ARM6
  • 中国民间网络外交组织(CCND)
  • 【C++进阶学习】第五弹——二叉搜索树——二叉树进阶及set和map的铺垫
  • (PADS学习)第二章:原理图绘制 第一部分
  • [开源软件] 支持链接汇总
  • VS2019中解决方案里的所有项目都是 <不同选项> 的解决方案
  • 重温react-06(初识函数组件和快速生成格式的插件使用方式)
  • AcWing 1256:扩展二叉树
  • C++ ariac2 Windows库编译
  • 【Node-RED 4.0.2】4.0版本新增特性(官方版)
  • 智能洗车管理系统设计
  • 安装llama_factory
  • HttpUtils工具类
  • base64字符串空格问题
  • 【智能算法】目标检测算法
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • input的行数自动增减
  • Java新版本的开发已正式进入轨道,版本号18.3
  • ng6--错误信息小结(持续更新)
  • PHP CLI应用的调试原理
  • Quartz初级教程
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • 编写高质量JavaScript代码之并发
  • 对超线程几个不同角度的解释
  • 服务器从安装到部署全过程(二)
  • 关于使用markdown的方法(引自CSDN教程)
  • 坑!为什么View.startAnimation不起作用?
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 前端工程化(Gulp、Webpack)-webpack
  • 使用common-codec进行md5加密
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • No resource identifier found for attribute,RxJava之zip操作符
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • ​TypeScript都不会用,也敢说会前端?
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (arch)linux 转换文件编码格式
  • (C语言)共用体union的用法举例
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (阿里云在线播放)基于SpringBoot+Vue前后端分离的在线教育平台项目
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (多级缓存)多级缓存
  • (九十四)函数和二维数组
  • (力扣)1314.矩阵区域和
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (转)Oracle 9i 数据库设计指引全集(1)
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包