📜  路由更改时如何让页面滚动到顶部?

📅  最后修改于: 2022-05-13 01:56:27.111000             🧑  作者: Mango

路由更改时如何让页面滚动到顶部?

假设我们点击 About Us 按钮,我们被定向到不同的页面,但它没有从顶部加载。我们必须自己向上滚动才能从头看到内容。我们的新页面从我们的 About Us 按钮(上一页)所在的高度加载。

发生这种情况是因为react-router-dom只知道更改路由。它不能从不同的位置加载页面。所以,当我们改变路由时,我们必须制作一个不同的功能组件来从顶部加载我们的页面。

先决条件:

  • npm & create-react-app 命令的基础知识。
  • 样式组件的基本知识。
  • useEffect React hooks 的基础知识。
  • react-router-dom的基础知识。

基本设置:您将使用create-react-app命令启动一个新项目,如下所示。

npx create-react-app react-router-scroll

现在通过在终端中输入给定的命令转到您的react-router-scroll文件夹。

cd react-router-scroll

所需模块:通过在终端中键入给定命令来安装此项目所需的依赖项。

npm install react-router-dom
npm install --save styled-components

现在在src文件夹中创建components文件夹,然后转到 components 文件夹并创建四个文件Home.js、About.js、Styling.js、GoToTop.js

项目结构:项目中的文件结构将如下所示。

示例:在此示例中,我们将设计一个从顶部加载我们的路由器页面的功能组件,为此我们需要操作 App.js 文件和其他创建的组件文件。

Home.js
import React from 'react'
import GoToTop from './GoToTop'
import { Header, Button, Content, RouterLink } from "./Styling"; 
const Home = () => {
    return (
        
        
GeeksForGeeks Homepage
                                                                
    ) }    export default Home


About.js
import React from 'react'
import GoToTop from './GoToTop';
import { Header, Button, Content, RouterLink } from "./Styling"; 
const About = () => {
    return (
        
        
GeeksForGeeks About Us
                                                                
    ) }    export default About


Styling.js
import { Link } from 'react-router-dom';
import styled from 'styled-components'; 
    
export const Header = styled.h1` 
   margin: 0; 
   padding: 0; 
   text-align: center; 
   color: green; 
`; 
  
export const Content = styled.div`
   overflowY: scroll; 
   height: 700px;
`;
  
export const RouterLink = styled(Link)`
   cursor: pointer; 
   transition: all 0.2s ease-in-out; 
   text-decoration: none; 
`;
  
export const Button = styled.button` 
  padding: 20px; 
  font-size: 20px; 
  position: relative; 
  left: 42%; 
  margin: 20px; 
  cursor: pointer;
`;


GoToTop.js
import { useEffect } from "react";
import { useLocation } from "react-router-dom";
  
export default function GoToTop() {
  const routePath = useLocation();
  const onTop = () => {
    window.scrollTo(0, 0);
  }
  useEffect(() => {
    onTop()
  }, [routePath]);
  
  return null;
}


App.js
import {BrowserRouter as Router, Switch, Route} from 'react-router-dom';
import Home from './components/Home';
import About from './components/About';
function App() {
  return (
     
      
        
         
      
     
  );
}
  
export default App;


关于.js

import React from 'react'
import GoToTop from './GoToTop';
import { Header, Button, Content, RouterLink } from "./Styling"; 
const About = () => {
    return (
        
        
GeeksForGeeks About Us
                                                                
    ) }    export default About

造型.js

import { Link } from 'react-router-dom';
import styled from 'styled-components'; 
    
export const Header = styled.h1` 
   margin: 0; 
   padding: 0; 
   text-align: center; 
   color: green; 
`; 
  
export const Content = styled.div`
   overflowY: scroll; 
   height: 700px;
`;
  
export const RouterLink = styled(Link)`
   cursor: pointer; 
   transition: all 0.2s ease-in-out; 
   text-decoration: none; 
`;
  
export const Button = styled.button` 
  padding: 20px; 
  font-size: 20px; 
  position: relative; 
  left: 42%; 
  margin: 20px; 
  cursor: pointer;
`; 

GoToTop.js

import { useEffect } from "react";
import { useLocation } from "react-router-dom";
  
export default function GoToTop() {
  const routePath = useLocation();
  const onTop = () => {
    window.scrollTo(0, 0);
  }
  useEffect(() => {
    onTop()
  }, [routePath]);
  
  return null;
}

说明:我们通过名称routePath初始化一个变量,并将当前 URL 的值存储在其中,该值通过useLocation()钩子返回。

现在创建了一个onTop函数,该函数在调用时从顶部加载网页。我们将此函数作为第一个参数(作为回调函数)和我们的变量 routePath 作为第二个参数(作为依赖项)传递给我们的 使用效果挂钩这意味着我们的函数onTop 只有在依赖 routePath 在渲染之间发生变化时才会执行。

当我们点击 About Us 按钮时, routePath 的值会发生变化(因为我们要访问一个新的 URL),并且 onTop函数会被触发,它会从顶部加载我们的页面。

应用程序.js

import {BrowserRouter as Router, Switch, Route} from 'react-router-dom';
import Home from './components/Home';
import About from './components/About';
function App() {
  return (
     
      
        
         
      
     
  );
}
  
export default App;

运行应用程序的步骤:从项目的根目录使用以下命令运行应用程序:

npm start

输出:现在打开浏览器并转到http://localhost:3000/ ,您将看到以下输出。我们可以观察到新的路由页面正在从顶部加载,如下所示。