我在使用react路由器引导时遇到活动链接问题(https://www.npmjs.com/package/react-router-bootstrap)组成部分。当我导航到“关于”时,活动类不仅出现在“关于”上,而且也出现在“主页”上。
主动链路路由器的问题
这是我的Nav组件从react-bootstrap(https://react-bootstrap.github.io/):
NavLinks.jsx
import React, { Component } from 'react';
import { Nav, NavItem } from 'react-bootstrap';
import HashNavItem from '../../Navigation/HashNavItem';
// import Flags from './Flags/Flags'
import "./NavLinks.css";
const routes = [{
name: 'Home',
path: '/',
external: false
},{
name: 'About',
path: '/about',
external: false
}, {
name: 'Stores',
path: '/#stores',
external: false
}, {
name: 'My Account',
path: 'http://my-react.appicar.com/',
external: true
}, {
name: 'Services',
path: '/#services',
external: false
}, {
name: 'Reviews',
path: '/#reviews',
external: false
}, {
name: 'Contact',
path: '/#contact',
external: false
}];
export default class MainNav extends Component {
handleClick(e) {
e.preventDefault();
alert('hola');
}
render() {
let template;
return (
<Nav>
{
routes.map((route, key) => {
if (route.external) {
template = (
<NavItem eventKey={ 'nav-' + key } href={ route.path } key={ key }>
{route.name}
</NavItem>
);
} else {
template = <HashNavItem eventKey={ 'nav-' + key } name={ route.name } to={ route.path } key={ key } />;
}
return template;
})
}
</Nav>
);
}
}
HashNavItem.jsx
import React, { Component } from "react";
import { NavItem } from 'react-bootstrap';
import { LinkContainer } from "react-router-bootstrap";
export default class HashNavItem extends Component {
constructor(props) {
super(props);
// Atributes.
this.hashFragment = '';
this.observer = null;
this.asyncTimerId = null;
this.scrollFunction = null;
// States.
this.state = {
key: props.eventKey,
name: props.name,
to: props.to
}
// Methods.
this.reset = this.reset.bind(this);
this.getElAndScroll = this.getElAndScroll.bind(this);
this.hashLinkScroll = this.hashLinkScroll.bind(this);
this.handleClick = this.handleClick.bind(this);
}
reset() {
this.hashFragment = '';
if (this.observer !== null) this.observer.disconnect();
if (this.asyncTimerId !== null) {
window.clearTimeout(this.asyncTimerId);
this.asyncTimerId = null;
}
}
getElAndScroll() {
const element = document.getElementById(this.hashFragment);
if (element !== null) {
this.scrollFunction(element);
this.reset();
return true;
}
return false;
}
hashLinkScroll() {
// Push onto callback queue so it runs after the DOM is updated
window.setTimeout(() => {
if (this.getElAndScroll() === false) {
if (this.observer === null) {
this.observer = new MutationObserver(this.getElAndScroll);
}
this.observer.observe(document, {
attributes: true,
childList: true,
subtree: true,
});
// if the element doesn't show up in 10 seconds, stop checking
this.asyncTimerId = window.setTimeout(() => {
this.reset();
}, 10000);
}
}, 0);
}
handleClick(e) {
this.reset();
if (this.props.onClick) this.props.onClick(e);
if (typeof this.props.to === 'string') {
this.hashFragment = this.props.to
.split('#')
.slice(1)
.join('#');
} else if (
typeof this.props.to === 'object' &&
typeof this.props.to.hash === 'string'
) {
this.hashFragment = this.props.to.hash.replace('#', '');
}
if (this.hashFragment !== '') {
this.scrollFunction =
this.props.scroll || (el =>
el.scrollIntoView(this.props.smooth ? { behavior: 'smooth' } : undefined)
);
this.hashLinkScroll();
}
}
render() {
return (
<LinkContainer to={ this.state.to }>
<NavItem eventKey={ this.state.key } key={ this.state.key } onClick={ this.handleClick }>{ this.state.name } </NavItem>
</LinkContainer>
);
}
}
App.jsx
import React, { Component } from "react";
import { Router, Switch, Route } from 'react-router-dom';
import { createBrowserHistory } from 'history';
import MainNav from './MainNav/MainNav';
import Logo from './Logo/Logo';
import Footer from './Footer/Footer';
import Copyright from './Copyright/Copyright';
import HomePage from './HomePage/HomePage';
import AboutPage from './AboutPage/AboutPage';
import Error404 from './Error404/Error404';
import './App.css';
class App extends Component {
render() {
return (
<Router history={ createBrowserHistory() }>
<div>
<MainNav />
<Logo />
<Switch>
<Route exact path="/" component={ HomePage } />
<Route exact path="/about" component={ AboutPage } />
<Route exact path="/404" component={ Error404 } />
</Switch>
<Footer />
<Copyright />
</div>
</Router>
);
}
}
export default App;
有人知道为什么家总是被标记为活动吗?
我相信这与您的路由有关(所以react路由器不一定是react路由器引导)。我看到您在路线声明中添加了“精确”,但我也会尝试在声明中添加“严格”。在我正在开发的一个应用程序中,为了让我的高阶组件验证包装正确工作,我必须这样做。
如果这不起作用,那么我猜您将如何迭代路由数组以动态创建导航链接。通过构建导航链接的方式,包清除活动状态可能存在问题。很抱歉,我没有更具体的答案!我还没有得到一个50的声誉,只是能够留下评论,所以希望有一个有用的答案将不得不这样做。
既然您已经使用了react bootstrap
软件包,那么您可以这样解决问题:
import { NavLink } from "react-router-dom";
import { Nav } from "react-bootstrap";
<Nav>
<Nav.Link as={NavLink} exact to="/">
Home
</Nav.Link>
<Nav.Link as={NavLink} exact to="/about">
About
</Nav.Link>
</Nav>
这里的关键是使用确切的
属性与Nav。Link
组件,并将as
属性设置为NavLink
,如上述代码段所示。
检查留档的NavLink
的确切的
属性的更多信息。
您应该使用IndexLinkContainer而不是LinkContainer
检查这里
我是新的反应,不知道为什么这不会起作用。 我的路由器代码在这里: 因此,这段代码所发生的情况是: localhost/显示良好
我正在尝试React-路由器(v4),我有问题启动的Nav有一个的。如果我单击任何标记,则活动内容开始工作。然而,我希望首页在应用程序启动后立即激活,因为这是在路由加载的组件。有什么办法可以做到这一点吗? 这是我目前的代码:
我的导航不工作,因为某些原因,我有另一个应用程序运行良好,但这一个不能找到错误,请帮助 反应路由器不工作。反应JS 我需要你的帮助。 使用react-router,我可以使用Link元素创建由react router本地处理的链接。
我的目标是让http://mydomain/route1呈现React组件Component1,让http://mydomain/route2呈现component2。因此,我认为编写如下路线是很自然的: http://mydomain/route1按预期工作,但http://mydomain/route2反而呈现Component1。 然后我读了这个问题,并将路线改为:
我已经稍微调整了React路由器的私有路由示例,以便与Redux玩得很好,但是当链接或重定向到其他页面时,不会呈现任何组件。这个例子可以在这里找到: https://reacttraining.com/react-router/web/example/auth-workflow 他们的PrivateRoute组件如下所示: 但是,因为我已经把它合并到一个Redux应用程序中,我不得不稍微调整一下私