面试题答案
一键面试不同点
Link
:Link
组件仅用于创建导航链接,没有内置的用于检测当前链接是否处于激活状态(即是否是当前显示页面的链接)的功能,因此不能直接基于链接的激活状态来设置样式。它只是提供了导航到指定路径的基本功能。
NavLink
:NavLink
继承自Link
,在Link
的基础上增加了检测当前链接是否激活的能力。当链接对应的路径与当前 URL 匹配时(可通过exact
等属性控制匹配规则),会自动添加特定的类名(默认为active
,可自定义),可以基于此为激活状态的导航项设置不同样式。
实现选中导航项特殊样式示例
-
使用
NavLink
:import React from'react'; import { BrowserRouter as Router, NavLink } from'react-router-dom'; const App = () => { return ( <Router> <div> <NavLink to="/home" activeClassName="selected" style={{ marginRight: '10px' }} > Home </NavLink> <NavLink to="/about" activeClassName="selected" style={{ marginRight: '10px' }} > About </NavLink> <style>{` .selected { color: red; font - weight: bold; } `}</style> </div> </Router> ); }; export default App;
在上述代码中,
NavLink
的activeClassName
属性指定了当链接激活时添加的类名selected
,然后通过 CSS 为selected
类设置了红色字体和加粗样式。 -
使用
Link
模拟选中样式(较为复杂):import React, { useState } from'react'; import { BrowserRouter as Router, Link } from'react-router-dom'; const App = () => { const [currentPath, setCurrentPath] = useState('/home'); const handleClick = (path) => { setCurrentPath(path); }; return ( <Router> <div> <Link to="/home" style={{ marginRight: '10px', color: currentPath === '/home'? 'red' : 'black', fontWeight: currentPath === '/home'? 'bold' : 'normal' }} onClick={() => handleClick('/home')} > Home </Link> <Link to="/about" style={{ marginRight: '10px', color: currentPath === '/about'? 'red' : 'black', fontWeight: currentPath === '/about'? 'bold' : 'normal' }} onClick={() => handleClick('/about')} > About </Link> </div> </Router> ); }; export default App;
这里通过
useState
来记录当前点击的路径,然后在Link
的style
中根据当前路径判断是否应用选中样式,相比NavLink
实现起来更繁琐。