javascript - 如何使用 react 路由器和 react 滚动在特定ID上平滑滚动导航到另一个页面

标签 javascript reactjs react-router

我正在尝试使导航栏导航到另一个页面并向下滚动到此页面上的某个 id

这是我的 protofolio 的 navBar 组件,它有 3 个链接 Projects应该去Home然后向下滚动到 projects项目部分中的 id

import React, { Component } from "react";
import logo from "../../images/logo.png";
import { Link } from "react-router-dom";
import Scroll from "react-scroll";
import "./NavBar.css";
const ScrollLink = Scroll.Link;

class NavBar extends Component {
  render() {
    return (
      <div className="NavBar">
        <Link to="/" className="logo-container">
          <img className="logo" src={logo} alt="Mahboub logo"></img>
        </Link>
        <div className="Nav-links">

          <Link to="/">Home</Link>
          <ScrollLink
            className="navy"
            smooth={true}
            duration={500}
            to="projects"
          >
            projects
          </ScrollLink>

          <Link to="/">Contacts</Link>
        </div>
      </div>
    );
  }
}
export default NavBar;

这是主页中项目部分的项目组件
function Projects() {
  return (
    <div className="Home-Projects">
      <Element id="projects">
        <h1>Projects</h1>
      </Element>
      <div className="Projects-container">
        <ProjectElement />
      </div>
    </div>
  );
}

最佳答案

如果“持续时间”参数对您来说不是很重要,并且您对 Hooks 没有任何问题,我想建议如下解决方案。

  • 您摆脱了 Scroll 组件并像这样在 NavBar 中使用来自 RR 的普通链接
    <Link to="/#projects">projects</Link>
    
  • 从 RR v5.1 Hooks was introduced .其中有 useLocation 钩子(Hook)。在 Projects 组件的最开始插入该钩子(Hook),如下所示:
    function Projects() {
    const location = useLocation()
    ...
    

  • 当您从第 1 页点击链接时,您将获得表单的新位置对象
    
        location = {
            ...
            pathname:"/",
            ...
            hash: "#projects"
        }
    
    
  • 调用 useEffect Hook useLocation像这样:
  • 
        useEffect(()=> {
                if (location.hash) {
                    let elem = document.getElementById(location.hash.slice(1))
                    if (elem) {
                        elem.scrollIntoView({behavior: "smooth"})
                    }
                } else {
                window.scrollTo({top:0,left:0, behavior: "smooth"})
                }
        }, [location,])
    
    

    就是这样。如您所见,如果您的网址中没有散列,您的页面将滚动到顶部。使用[locaton,]useEffect当您的页面组件不是因为位置更改而重新呈现时,依赖项会阻止表单滚动。

    关于javascript - 如何使用 react 路由器和 react 滚动在特定ID上平滑滚动导航到另一个页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61779236/

    相关文章:

    django - 如何将django身份验证与react-router集成?

    javascript - 我运行了 react native 链接 Realm 但仍然出现错误

    javascript - react 路由器渲染导致卸载

    javascript - 我怎么知道 Lat,Lng 点是否有街景?

    javascript - 是否可以在将 optionsValue 存储在下拉列表中的同时显示 optionsText?

    javascript - 如何仅在对象内的所有 id 完成 fetch 后设置 sate

    iis - React-router - 添加路由后我收到 404

    javascript - Reactjs 路由未返回正确的结果

    javascript - Firefox 中文本框的 onpropertychange?

    javascript - Node.js process.exit() 不会在 createReadStream 打开时退出