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

React/Nextjs项目点击新链接后如何移除之前点击链接的边框样式

解决方案

你当前的核心问题是没有通过React状态统一管理选中项,而是直接操作单个DOM元素的行内样式,没有记录上一个选中元素的引用,自然无法清除旧样式。建议改为状态驱动的样式绑定,无需手动操作DOM,实现逻辑更简洁:


修改后的完整代码

import { useEffect, useState } from 'react';
import Link from 'next/link';
import Logo from '../../components/logo.svg';
import React from 'react';
import getConfig from 'next/config';
import { useRouter } from 'next/router';

const {
    publicRuntimeConfig: { domain },
} = getConfig();

export default function MediaNav() {
    const router = useRouter();
    const menu = ['Home', 'FAQs', 'Contact Us', 'Social Media'];
    // 状态存储当前选中的菜单项索引,初始可匹配当前路由实现自动高亮
    const [selectedIndex, setSelectedIndex] = useState(-1);

    // 可选:页面加载/路由变化时自动匹配当前路由对应的菜单项高亮
    useEffect(() => {
        const currentPath = router.pathname;
        const matchIndex = menu.findIndex(item => {
            const href = item === 'Home' ? '/subdomain/link' : `/subdomain/${item}`.replace(/\s+/g, '').toLowerCase();
            return href === currentPath;
        });
        if(matchIndex > -1) setSelectedIndex(matchIndex);
    }, [router.pathname])

    const handleLinkClick = (index) => {
        // 仅更新选中索引,样式会随状态自动重渲染
        setSelectedIndex(index);
    };

    return (
        <nav>
            <div>
                <Link href={`${domain}`}>
                    <a>
                        <Logo />
                    </a>
                </Link>
            </div>
            <ul>
                <div>
                    <ul>
                        <li>
                            <a href="/subdomain/link">All Sites</a>
                        </li>
                    </ul>
                    <ul>
                        {menu.map((item, i) => {
                            const href = item === 'Home' ? '/subdomain/link' : `/subdomain/${item}`.replace(/\s+/g, '').toLowerCase();
                            return (
                                <li key={i}>
                                    <Link href={href}>
                                        <a 
                                            onClick={() => handleLinkClick(i)}
                                            {/* 动态绑定样式,当前选中项加边框,否则无样式 */}
                                            style={{
                                                borderLeft: selectedIndex === i ? '3px solid #005ba9' : 'none',
                                                borderRight: selectedIndex === i ? '3px solid #005ba9' : 'none'
                                            }}
                                        >
                                            {item}
                                        </a>
                                    </Link>
                                </li>
                            );
                        })}
                    </ul>
                </div>
            </ul>
        </nav>
    );
}

核心修改点

  • 废弃直接操作DOM样式的逻辑,所有样式通过React状态动态绑定,符合声明式编程规范
  • 状态仅存储当前选中的菜单项索引,点击新元素时更新索引,React自动重渲染所有菜单项,旧选中项的边框会自动移除,无需手动清除
  • 新增路由匹配的可选逻辑,即使用户直接访问子页面、刷新页面,也能正确高亮对应菜单项,适配Next.js单页跳转的场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 03:54:01