You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

React Router与Semantic UI React的Menu.Item使用问题求助

嘿,作为React新手碰到这个组合问题太正常啦!我来帮你梳理下这两个工具搭配时最常见的问题和对应的解决办法:

一、Active状态样式不生效(最常见)

Semantic UI的Menu.Item自带active样式,但直接嵌套NavLink时,默认不会自动同步路由激活状态,这时候有两种靠谱的解决方式:

方式1:直接用NavLink搭配Semantic的类名

把NavLink直接作为菜单选项,给它加上Semantic的item类,再利用NavLink的activeClassName绑定Semantic的active类:

import { Menu } from 'semantic-ui-react';
import { NavLink } from 'react-router-dom';

const Navbar = () => {
  return (
    <Menu>
      {/* 根路径记得加end(React Router v6)或者exact(v5) */}
      <NavLink 
        to="/" 
        end 
        className="item" 
        activeClassName="active"
      >
        Home
      </NavLink>
      <NavLink 
        to="/user" 
        className="item" 
        activeClassName="active"
      >
        User
      </NavLink>
      <NavLink 
        to="/dashboard" 
        className="item" 
        activeClassName="active"
      >
        Dashboard
      </NavLink>
    </Menu>
  );
};

export default Navbar;

Semantic UI React支持通过as属性把组件渲染成其他元素/组件,这里我们把Menu.Item转换成NavLink,然后通过active属性接收路由激活状态:

import { Menu } from 'semantic-ui-react';
import { NavLink } from 'react-router-dom';

const Navbar = () => {
  return (
    <Menu>
      <Menu.Item
        as={NavLink}
        to="/"
        end
        active={({ isActive }) => isActive}
      >
        Home
      </Menu.Item>
      <Menu.Item
        as={NavLink}
        to="/user"
        active={({ isActive }) => isActive}
      >
        User
      </Menu.Item>
      <Menu.Item
        as={NavLink}
        to="/dashboard"
        active={({ isActive }) => isActive}
      >
        Dashboard
      </Menu.Item>
    </Menu>
  );
};

export default Navbar;

这种方式更贴合Semantic组件的使用习惯,样式也会自动同步。

二、路由跳转完全没反应

如果点击菜单完全没跳转,先检查这一点:

确保你的整个路由相关组件(包括Navbar、页面组件)都被BrowserRouter(或其他Router)包裹!

比如你的App.jsx应该是这样的:

import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import Navbar from './Navbar';
import Home from './Home';
import User from './User';
import Dashboard from './Dashboard';

function App() {
  return (
    <Router>
      <Navbar />
      {/* React Router v6用Routes包裹Route,v5用Switch */}
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/user" element={<User />} />
        <Route path="/dashboard" element={<Dashboard />} />
      </Routes>
    </Router>
  );
}

export default App;

没有Router包裹的话,NavLink根本不知道路由上下文,自然不会生效。

小提示

  • React Router v6里,exact属性被替换成了end,如果用的是v5版本,记得把end改成exact
  • 如果还有特殊的路由匹配需求,可以自定义NavLink的isActive函数来控制激活状态。

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

火山引擎 最新活动