javascript 与React-Router的活动链接?

i5desfxk  于 2022-12-21  发布在  Java
关注(0)|答案(7)|浏览(190)

我在试用React路由器(v4),我在启动导航时遇到问题,无法将其中一个Link设置为active。如果我单击任何Link标记,则活动的内容开始工作。但是,我希望Home Link在应用程序启动后立即处于活动状态,因为这是在/路径加载的组件。有什么方法可以做到吗?
下面是我目前的代码:

const Router = () => (
  <BrowserRouter>
    <div>
      <Nav>
        <Link activeClassName='is-active' to='/'>Home</Link> {/* I want this to start off as active */}
        <Link activeClassName='is-active' to='/about'>About</Link>
      </Nav>

      <Match pattern='/' exactly component={Home} />
      <Match pattern='/about' exactly component={About} />
      <Miss component={NoMatch} />
    </div>
  </BrowserRouter>
)
nukf8bse

nukf8bse1#

  • 这是针对React Router v4的过时答案*

<Link>不再具有activeClassNameactiveStyle属性。在react-router v4中,如果要执行条件样式,则必须使用<NavLink>

const Router = () => (
  <BrowserRouter>
    <div>
      <Nav>
        <NavLink exact activeClassName='is-active' to='/'>Home</NavLink>
        <NavLink activeClassName='is-active' to='/about'>About</NavLink>
      </Nav>

      <Match pattern='/' exactly component={Home} />
      <Match pattern='/about' exactly component={About} />
      <Miss component={NoMatch} />
    </div>
  </BrowserRouter>
)

我添加了一个确切的属性到主页<NavLink>,我相当肯定,如果没有它,主页链接将始终处于活动状态,因为/将匹配/about和任何其他页面。

js4nwp54

js4nwp542#

    • React路由器v6:**

来源:Active NavLink Classes with React Router
现在你可以使用className属性,它现在接受一个函数并传递一个isActive布尔属性,如下所示:

<NavLink
  to="users"
  className={({ isActive }) => (isActive ? 'active' : 'inactive')}
>
  Users
</NavLink>

您还可以添加多个类,因为v6已过时:

<NavLink
  to="users"
  className={({ isActive }) =>
    isActive ? 'bg-green-500 font-bold' : 'bg-red-500 font-thin'
  }
>
  Users
</NavLink>

实时演示:Active NavLink Classes with React Router

nnvyjq4y

nnvyjq4y3#

import { NavLink, useMatch, useResolvedPath } from 'react-router-dom';

const CustomNavLink = ({ to, title }) => {
   let resolved = useResolvedPath(to);
   let match = useMatch({ path: resolved.pathname, end: true });

   return (
      <NavLink to={to} className={`d-flex align-items-center py-2 px-4 ${match ? 'cta-btn' : 'c-n-b-link'}`} >
        <span className='ms-1 f-w-600'>{title}</span>
      </NavLink>
)
}

对于React router V6,只要路径与给定的to路径匹配,上述自定义组件将返回一个navlink,该navlink可以激活活动类。

oprakyz7

oprakyz74#

react-router-dom Version 5.3.0中,我使用了以下代码来启用活动链接

班级:

active: {
        // background: 'linear-gradient(180deg, #008b32 0%, #cddc39 100%)',
        // backgroundColor: 'slategray',
        borderBottom: '1px solid white',
        borderRadius: '6px',
        boxShadow: 'rgba(6, 24, 44, 0.4) 0px 0px 0px 2px , rgba(6, 24, 44, 0.65) 0px 4px 6px -1px , rgba(255, 255, 255, 0.08) 0px 1px 0px inset',
        color: 'white',
        fontSize: '14px',
        listStyle: 'none',
        marginLeft: '16px',
        padding: '5px',
        textDecoration: 'none',
        textTransform: 'uppercase',
        transition: 'all 0.1s cubic-bezier(0.42, 0.02, 0.06, 0.05) 0.1s',
    },
    link: {
        '&:hover': {
            borderBottom: '1px solid white',
            borderRadius: '6px',
            boxShadow: 'rgba(6, 24, 44, 0.4) 0px 0px 0px 2px , rgba(6, 24, 44, 0.65) 0px 4px 6px -1px , rgba(255, 255, 255, 0.08) 0px 1px 0px inset',
            color: 'white',
            padding: '5px',
            transition: 'all 0.1s cubic-bezier(0.42, 0.02, 0.06, 0.05) 0.1s',
        },
        color: '#ddf1f9',
        fontSize: '14px',
        listStyle: 'none',
        marginLeft: '16px',
        textDecoration: 'none',
        textTransform: 'uppercase'
    },

导航链接.js

import React from "react";
import { useLocation } from "react-router-dom";

const NavLinks = classes => {
    const pathname = useLocation().pathname
    return (
        <nav>
            <ul className={classes.navlinks}>
                <li>
                    <Link
                        className={`${pathname === '/' ? classes.active : classes.link}`}
                        to='/'
                    >
                        Login
                    </Link>
                </li>
                <li>
                    <Link
                        className={`${pathname === '/dashboard' ? classes.active : classes.link}`}
                        to='/dashboard'
                    >
                        Dashboard
                    </Link>
                </li>
            </ul>
        </nav>
    )
}
ippsafx7

ippsafx75#

作为@Nick答案(React Router v6)的补充,对于需要上层上下文中的活动导航状态的用户..

条件渲染可能是一个需要的用例。例如:如果它是活动的,则渲染填充图标,否则渲染常规图标。
这可以通过找到我们当前所在的路线来实现,然后我们可以进行条件渲染操作,但这会有点麻烦。
相反,我们可以编写一个函数来修改Navlink的样式属性中的状态,如下所示。

const [active, setActive] = useState('home')

  const activate = (isActive, path, activeStyle, nonActiveStyle) => {
    if (isActive) {
      setActive(path)
      return activeStyle
    }
    return nonActiveStyle
  }

  return (
    <nav>
      <NavLink
        to="/"
        style={(activeNav) => activate(activeNav.isActive, 'home')}
      >
        {active === 'home' ? <HomeFill /> : <Home />}
      </NavLink>
      <NavLink
        to="/profile"
        style={(activeNav) => activate(activeNav.isActive, 'profile')}
      >
        {active === 'profile' ? <ProfileFilled /> : <Profile />}
      </NavLink>
    </nav>
  )
pw9qyyiw

pw9qyyiw6#

在我的示例中,<NavLink />自动将active类设置为items,因此我使用以下方法

我的组件js

<ListItem component={NavLink} to="/somewhere" className="myactive" > something </ListItem>

我的样式.css

a.active.myactive {
 // some styles
}
r6hnlfcb

r6hnlfcb7#

受@Live Software Developer的启发,在v6中,我相信这样做要简单得多(下面的输入来自TypeScript):

const CustomNavLink: React.FC<{ to: string; text: string }> = ({
  to,
  text,
}) => {
  return (
    <NavLink
      to={to}
      className={({ isActive }) => (isActive ? "active" : "inactive")}
    >
      {text}
    </NavLink>
  );
};

相关问题