使用 React Hooks实现一个返回顶部的按钮

该文章介绍了如何在React应用中创建一个返回顶部的组件,包括设置固定定位、监听滚动事件以控制显示和隐藏,以及使用节流函数优化性能,确保滚动事件不会过于频繁触发,导致性能问题。最后,提到了添加平滑滚动效果的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

设置定位

按钮定位设置为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) || 200
  return (...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实现一个返回顶部的按钮

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值