You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用react-scroll实现单页应用下拉菜单导航后菜单不关闭问题

解决React-Scroll下拉菜单点击后不自动收起的问题

问题本质是:移动端下拉菜单展开后,点击react-scroll的Link组件仅会触发滚动行为,不会触发菜单关闭逻辑。我们需要在点击导航链接时,同时执行关闭菜单的操作。

解决方案:给导航链接添加关闭菜单的点击事件

修改Navbar组件,新增专门的菜单关闭函数,并绑定到每个Link的点击事件上:

修改后的Navbar代码

import { useRef } from "react";
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import React from 'react';
import { faBars, faCircleXmark } from '@fortawesome/free-solid-svg-icons';
import "./Navbar.css";
import {Link} from 'react-scroll';

function Navbar() {
    const navRef = useRef();

    const showNavbar = () => {
        navRef.current.classList.toggle("responsive_nav");
    };

    // 仅执行菜单关闭操作,避免toggle带来的意外展开
    const closeNavbar = () => {
        navRef.current.classList.remove("responsive_nav");
    };

    return (
        <header>
            <nav ref={navRef}>  
                <Link 
                    to="home" 
                    spy={true} 
                    smooth={true} 
                    offset={-100} 
                    duration={500}
                    onClick={closeNavbar}
                >Home</Link>
                <Link 
                    to="about" 
                    spy={true} 
                    smooth={true} 
                    offset={-100} 
                    duration={500}
                    onClick={closeNavbar}
                >About me</Link>
                <Link 
                    to="mywork" 
                    spy={true} 
                    smooth={true} 
                    offset={-100} 
                    duration={500}
                    onClick={closeNavbar}
                >My Work</Link>
                <Link 
                    to="contact" 
                    spy={true} 
                    smooth={true} 
                    offset={-150} 
                    duration={500}
                    onClick={closeNavbar}
                >Contact</Link>
                <button
                    className="nav-btn nav-close-btn"
                    onClick={showNavbar}>
                    <FontAwesomeIcon icon={faCircleXmark} style={{color: "#FFB30D",}} />
                </button>
            </nav>
            <button
                className="nav-btn nav-open"
                onClick={showNavbar}>
                <FontAwesomeIcon icon={faBars} style={{color: "#FFB30D",}}/>
            </button>
        </header>
    );
}

export default Navbar;

逻辑说明

  • 新增closeNavbar函数,直接移除控制菜单展开的responsive_nav类,确保点击链接后菜单只会关闭,不会出现意外展开的情况。
  • 给每个导航Link绑定onClick={closeNavbar},让点击导航链接的同时触发菜单关闭操作。

优化方案:封装自定义滚动链接组件

如果导航链接数量较多,可封装一个带关闭逻辑的自定义ScrollLink组件,减少重复代码:

const ScrollLink = ({ to, offset = -100, children }) => {
    const closeNavbar = () => {
        navRef.current.classList.remove("responsive_nav");
    };

    return (
        <Link 
            to={to} 
            spy={true} 
            smooth={true} 
            offset={offset} 
            duration={500}
            onClick={closeNavbar}
        >
            {children}
        </Link>
    );
};

在Navbar中使用该组件:

<ScrollLink to="home">Home</ScrollLink>
<ScrollLink to="about">About me</ScrollLink>
<ScrollLink to="mywork">My Work</ScrollLink>
<ScrollLink to="contact" offset={-150}>Contact</ScrollLink>

内容的提问来源于stack exchange,提问作者Igor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 11:55:13