gpt4 book ai didi

reactjs - React Router v4 在父级上设置 activeClass

转载 作者:行者123 更新时间:2023-12-03 13:20:54 25 4
gpt4 key购买 nike

对 React Router 不太熟悉,但我需要 NavLink 的功能来在父 li 元素上设置事件类,而不是在 a 元素上。

为了实现这一点,我只需查看 NavLink 的源代码并将其复制到一个新元素中。 (使用 typescript 的示例,但无论如何与 js 差不多)

import * as React from 'react';
import { Link, withRouter, Route } from 'react-router-dom';


class LiNavLink extends React.Component<any, {}> {
render() {
const {to,exact, strict, activeClassName, className, activeStyle, style, isActive: getIsActive, ...rest } = this.props;
return (
<Route
path={typeof to === 'object' ? to.pathname : to}
exact={exact}
strict={strict}
children={({ location, match }) => {
const isActive = !!(getIsActive ? getIsActive(match, location) : match)

return (
<li
className={isActive ? [activeClassName, className].join(' ') : className}
style={isActive ? { ...style, ...activeStyle } : style}>
<Link
to={to}
{...rest}
/>
</li>
)
}}
/>
);
}
}

export default LiNavLink;

然后是用法:

<ul>
<LiNavLink activeClassName='active' exact={true} strict to="/example"><span>Active</span></LiNavLink>
<LiNavLink activeClassName='active' exact={true} strict to="/example/archived"><span>Archived</span></LiNavLink>
</ul>

我正在使用 HashRouter ,由于某种我无法弄清楚的原因,当路由更改时,它不会更新,只有当我硬“刷新”页面时,它才会更新如何应该的。

我相信它永远不会更新,因为 Prop 永远不会改变?那么它不知道自己更新吗?

我怎样才能更新它?还是我的问题出在其他地方?

最佳答案

经过多次尝试,我在 v4 中做到了。

这是我的工作代码。

import React, { Component } from "react";
import logo from "../../logo.svg";
import { Link, withRouter } from "react-router-dom";
import PropTypes from "prop-types";

class Navbar extends Component {
static propTypes = {
match: PropTypes.object.isRequired,
location: PropTypes.object.isRequired,
history: PropTypes.object.isRequired
};

state = {};

getNavLinkClass = path => {
return this.props.location.pathname === path
? "nav-item active"
: "nav-item";
};
render() {
return (
<nav className="navbar navbar-expand-lg navbar-dark bg-dark">
<Link className="navbar-brand" to="/">
<img
src={logo}
width="30"
height="30"
className="d-inline-block align-top"
alt=""
/>
Utility
</Link>
<button
className="navbar-toggler"
type="button"
data-toggle="collapse"
data-target="#navbarNav"
aria-controls="navbarNav"
aria-expanded="false"
aria-label="Toggle navigation"
>
<span className="navbar-toggler-icon" />
</button>
<div className="collapse navbar-collapse" id="navbarNav">
<ul className="navbar-nav">
<li className={this.getNavLinkClass("/")}>
<Link className="nav-link" to="/">
Home
</Link>
</li>
<li className={this.getNavLinkClass("/age-counter")}>
<Link className="nav-link" to="/age-counter">
Age Counter
</Link>
</li>
</ul>
</div>
</nav>
);
}
}

export default withRouter(Navbar);

演示工作 Code Sandbox

Working gif image

关于reactjs - React Router v4 在父级上设置 activeClass,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42980858/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com