样式化组件 React router v6

Styled components React router v6

const StyledNavLink = styled(NavLink)`
  text-decoration: ${(props) => {
    console.log(props.style);
    return props.style ? (isActive) => (isActive ? "underline" : "none") : "none";
  }};
  &:hover {
    text-decoration: underline;
  }
`;

export default function BasicExample() {
  return (
    <Router>
      <Navbar>
        <NavItems>
          <NavItem>
            <NavLink
              to="/"
              end={true}
              style={({ isActive }) => {
                console.log(isActive + "About");
                return { textDecoration: isActive ? "underline" : "none" };
              }}
            >
              Home
            </NavLink>
          </NavItem>
          <NavItem>
            <NavLink
              to="/about"
              style={({ isActive }) => {
                console.log(isActive + "About");
                return { textDecoration: isActive ? "underline" : "none" };
              }}
            >
              About
            </NavLink>
          </NavItem>
          <NavItem>
            <NavLink
              to="/dashboard"
              style={({ isActive }) => {
                console.log(isActive + "Dashboard");
                return { textDecoration: isActive ? "underline" : "none" };
              }}
            >
              Dashboard
            </NavLink>
          </NavItem>
        </NavItems>
      </Navbar>
      <Routes>
        <Route path="/" caseSensitive={false} element={<Home />}></Route>
        <Route path="/about" caseSensitive={false} element={<About />}></Route>
        <Route path="/dashboard" caseSensitive={false} element={<Dashboard />}></Route>
      </Routes>
    </Router>
  );
}

我如何才能抽象出用于设置活动 link 样式的逻辑以表示 StyledNavLink 样式组件,我尝试使用 StyledNavLink 代替 Navlink 但它不起作用。我不确定我可能会遗漏什么。 如果我在 StyledNavLink 中调出 props.style,那么它始终是未定义的。

我对此不太确定,但我在使用 styled-componentsNextJSLink 进行样式设置时遇到了类似的问题。所以也许这也可以在这里工作。


解决方法

您可以创建一个 LinkWrapper 样式的组件,将 link 与 divspan 等任何默认组件包装起来,这不会产生任何其他问题到你正在尝试做的事情,然后设置 Navlik 的样式,这实际上将成为 a 标签,因此你可以嵌套设置 a 标签 (NavLink) 使用LinkWrapper.

const LinkWrapper= styled.div`
  a {
    display: flex;
    justify-content: ${props => props.propToPass ? 'flex-start' : 'center'};
    align-items: center;
  }
`;

function App(props) {
  return(
    <LinkWrapper propToPass={/**/}>
      <Link to={props.link}>
        {props.name}
      </Link>
    </LinkWrapper>
  );
}

试试这个,我认为这是一个解决方案

const StyledNavLink = styled(NavLink)`
  text-decoration: ${(props) => {
    console.log(props.style);
    return props.style ? (isActive) => (isActive ? "underline" : "none") : "none";
  }};
  &:hover {
    text-decoration: underline;
  }
 &[aria-current] {
    color: red;
  }
`;

我只需要检查 aria-current 属性是否存在,现在如果我用 StyledNavLink 替换 NavLink,一切都会按预期工作

或者,如下所示,可以检查是否存在活动 class

const StyledNavLink = styled(NavLink)`
    text-decoration: ${(props) => {
    console.log(props);
    return props.style ? (isActive) => (isActive ? "underline" : "none") : "none";
  }}; 
  &:hover {
    text-decoration: underline;
  }
 &[class*="active"] {
    color: red;
  }
`;