【回到顶部】是许多网页非常常用的按钮,通常放在长页面的右下角,点击可以直接让页面回到顶端。

要实现这个组件,需要以下几个要点:

设置定位

按钮定位设置为position: fixed,并且设置位置到屏幕右下角

.top-jumper {position: fixed;right: 11%;bottom: 15%;width: 42px;height: 42px;background-color: #fff;border: 1px solid #ddd;border-radius: 4px;font-size: 12px;
}
.top-jumper:before {content: '▲';display: block;text-align: center;color: #aaa;line-height: 42px;
}
.top-jumper:hover:before {content: '回顶部';
}

基本组件结构

import '@/App.css';
const BackToTop = () => {return (<div className="top-jumper" onClick={() => window.scrollTo(0, 0)}><span className="text"></span></div>);
};export default BackToTop;

控制显隐

当然,一般来说如果页面在顶部,按钮是不显示的,我们需要监听滚动事件,等到页面下拉到一定高度再显示,现在我们结合state hookseffect hooks控制按钮的显隐

import React, { useEffect, useState } from 'react';
import '@/App.css';function TopJumper() {// 显隐状态const [show, switchShow] = useState(false);useEffect(() => {const listener = () => {switchShow(window.scrollY > 300);};document.addEventListener('scroll', listener);// 组件销毁后,取消监听return () => document.removeEventListener('scroll', listener);}, [show]);return show ? (<div className="top-jumper" onClick={() => window.scrollTo(0, 0)}><span className="text"> </span></div>) : null;
}export default TopJumper;

实现节流

你以为这就完了?非也。但如果你是“又不是不能用”星人,那么下面的内容对你来说已经没用了!
作为一个资深切图仔,应该察觉到上面那段代码是不完美的,原因就在于浏览器滚动事件调用得太频繁了,会造成一定的性能问题。
我们得实现一个节流函数:

const createThrottle = (callback: Function,delay?: number,thisArg?: unknown
): Function =>{let lastInvokeTime: number = Date.now();const _delay = Number(delay) || 200return (...args: any[]): void=>{const now = Date.now()if (now - _delay <= lastInvokeTime) {return;}lastInvokeTime = now;callback.call(thisArg, ...args)}
}
export {createThrottle
}

改造组件

import React, { useEffect, useState } from 'react';
import { createThrottle } from '@/utils/helpers';
import '@/App.css';
const BackToTop = () => {// 图标的显隐状态const [show, switchShow] = useState(false);useEffect(() => {const listener = createThrottle(() => {const shouldShow = window.scrollY > 300;if (shouldShow !== show) {switchShow(shouldShow);}}, 500) as EventListener; // 事件监听器document.addEventListener('scroll', listener);// 组件销毁时,取消监听return () => document.removeEventListener('scroll', listener);}, [show]);return show ? (<div className="top-jumper" onClick={() => window.scrollTo(0, 0)}><span className="text"></span></div>) : null;
};export default BackToTop;

彩蛋

css中对html跟元素添加scroll-behavior: smooth;属性,实现网页平滑滚动(不兼容低版本的浏览器)

原文链接:

【React】如何使用 React Hooks实现一个返回顶部的按钮

使用 React Hooks实现一个返回顶部的按钮相关推荐

  1. axure下移固定地方_axure固定元件位置 教程:使用axure动态面板制作一个返回顶部的按钮...

    许多网站上都有一个"返回页首"按钮.无论屏幕如何滚动,"返回顶部"按钮始终浮动在固定位置,随时可用.一旦点击它,他就像一个小小的火箭,摇晃起来,页面将返回页面顶 ...

  2. HTML点击元素页面回到顶部,博客园页面添加返回顶部 TOP 按钮

    博客园页面添加返回顶部 TOP 按钮 TOP 按钮 进入网页管理 -> 设置 在 "页面定制 CSS 代码" 中添加如下 CSS 样式, 当然你可以改为自己喜欢的样式 此处可 ...

  3. 移动端的返回顶部悬浮按钮还需要存在吗?

    一. 返回顶部悬浮按钮的出现 返回顶部悬浮按钮大家都不陌生,在pc端浏览网页的时候都会在右下角出现,方便用户点击后直接返回到顶部.产品功能都是为了解决用户的需求而出现的,返回顶部悬浮按钮也是如此.那么 ...

  4. 如何使用 React 和 React Hooks 创建一个天气应用

    大家好,我是若川(点这里加我微信 ruochuan12,长期交流学习).今天推荐一个练手的React项目,创建天气应用,相信很快能看完.昨天发送书掉粉18人,是我没想到的,送书一般是出版社按阅读量赞助 ...

  5. 【前端】HTML底部返回顶部悬浮按钮

    CSS样式: .back-to {bottom: 55px;overflow: hidden;position: fixed;right: 10px;width: 110px;z-index: 999 ...

  6. jquery 实现返回顶部功能

    1. html 中添加一个返回顶部的按钮,本例中采用了一个绝对定位的div,(position:fixed),背景色给了一定的透明度,并加入一个向上的箭头icon. 2. 绑定window 的scro ...

  7. react hooks使用_如何开始使用React Hooks:受控表格

    react hooks使用 by Kevin Okeh 由Kevin Okeh 如何开始使用React Hooks:受控表格 (How to Get Started With React Hooks: ...

  8. React hooks中swr的原理和源码解析

    授权转载自:JonyYu https://github.com/forthealllight/blog/issues/61 swr是一个hook组件,可以作为请求库和状态管理库,本文主要介绍一下在项目 ...

  9. 返回顶部的js实现(jQuery/MooTools)

    一.引言 在web页面中,如果页面较高,为了方便用户快速地返回顶部,都会添加一个返回顶部按钮.例如: 如果你看到这段文字,说明转自<一棵树-博客园>,原文链接:http://www.cnb ...

最新文章

  1. Autodesk Cloud Accelerator Program 开始报名
  2. 【错误记录】Flutter 构建报错 ( Because xxx requires SDK version >=2.12.0-0 <3.0.0, versio | Dart SDK 版本低 )
  3. OpenCV图像处理实际案例(一)---图像倾斜矫正(仿射变换)和去边(轮廓查找+ROI提取)
  4. MPAndroidChart——饼图
  5. 如何在Windows下安装Linux子系统(Ubuntu,openSUSU,SUSU Linux Server)
  6. 【APICloud系列|31】百度导航功能的实现
  7. MS Code 使用 TFVC 插件时遇到的问题
  8. 从面试的这些细节就可判断公司的好坏
  9. WPF基础学习笔记(一)Dependency Object 和 Dependency Property
  10. 华为云发布“华为鲲鹏”培训认证体系,助力开发者“化鲲为鹏”
  11. 华为荣耀9x怎么解账户锁_荣耀X10顶配与30S最低配形成200元的价差,我觉得这样是最好的...
  12. 软工之404 Note Found队选题报告
  13. Atitit office ooxml 系列 excel的读取api 框架 poi的使用
  14. mysql 回滚_【133期】面试官:你说熟悉MySQL事务,那来谈谈事务的实现原理吧!...
  15. 线性反馈移位寄存器(LFSR,Linear Feedback Shift Register)
  16. Beyond Compare软件进行代码比对
  17. html 简单表格代码
  18. 什么款式蓝牙耳机玩游戏更舒适?五款小巧低延迟蓝牙耳机推荐
  19. 微信小程序登陆/注册界面及接口开发实战(二)
  20. 重新定义软件定义安全

热门文章

  1. 给最近正在找工作(iOS)的朋友一些建议/经验
  2. 将WORD中的文档编号转换成文字(宏命令法)
  3. ECS服务器选择SSD云盘和高效云盘选择哪个好?
  4. 26.CF1000F One Occurrence
  5. 深度学习-CV方向基本原理
  6. 【mybatis】mybatis中使用小于号
  7. Unity3dUGUI十步三点教你创建游戏排行榜界面
  8. WDNet—2020ECCV
  9. 健身-胸-背-肩-腿-核心锻炼方法
  10. python-__shots__