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

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

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

设置定位

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
系统 以下是一个使用React Hooks设计学生成绩管理系统的简单示例: 1. 首先,我们需要导入React和useState Hook。useState Hook可以帮助我们在函数组件中使用状态。 ``` import React, { useState } from 'react'; ``` 2. 我们需要一个数组来存储学生的成绩。我们可以使用useState Hook来创建它: ``` const [grades, setGrades] = useState([]); ``` 3. 接下来,我们需要一个表单来让用户输入学生成绩。我们可以使用useState Hook来创建一个表单状态: ``` const [formData, setFormData] = useState({ name: '', grade: '' }); ``` 4. 然后,我们需要一个函数来处理表单提交。该函数将获取用户输入的名称和成绩,并将其添加到成绩数组中: ``` const handleSubmit = (event) => { event.preventDefault(); setGrades([...grades, formData]); setFormData({ name: '', grade: '' }); }; ``` 5. 然后,我们需要一个函数来渲染表单。该函数将包含一个文本框来输入学生的名称,以及一个下拉列表来选择学生的成绩: ``` const renderForm = () => { return ( <form onSubmit={handleSubmit}> <label> Name: <input type="text" value={formData.name} onChange={(event) => setFormData({ ...formData, name: event.target.value }) } /> </label> <label> Grade: <select value={formData.grade} onChange={(event) => setFormData({ ...formData, grade: event.target.value }) } > <option value="">Select a grade</option> <option value="A">A</option> <option value="B">B</option> <option value="C">C</option> <option value="D">D</option> <option value="F">F</option> </select> </label> <button type="submit">Add Student Grade</button> </form> ); }; ``` 6. 最后,我们需要一个函数来渲染成绩列表。该函数将遍历成绩数组并将每个学生的名称和成绩显示在列表中: ``` const renderGrades = () => { return ( <ul> {grades.map((grade, index) => ( <li key={index}> {grade.name} - {grade.grade} </li> ))} </ul> ); }; ``` 7. 现在,我们可以在函数组件中使用这些函数来渲染整个学生成绩管理系统: ``` const StudentGrades = () => { const [grades, setGrades] = useState([]); const [formData, setFormData] = useState({ name: '', grade: '' }); const handleSubmit = (event) => { event.preventDefault(); setGrades([...grades, formData]); setFormData({ name: '', grade: '' }); }; const renderForm = () => { // ... }; const renderGrades = () => { // ... }; return ( <div> <h1>Student Grades</h1> {renderForm()} {renderGrades()} </div> ); }; ``` 这是一个简单的使用React Hooks设计的学生成绩管理系统。您可以根据需要添加更多功能,例如删除成绩,编辑成绩等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值