Navitem中的React-Bootstrap链接项

cha*_*idt 78 react-bootstrap react-router

我在使用react-router和react-bootstrap时遇到了一些样式问题.下面是代码的片段

import { Route, RouteHandler, Link } from 'react-router';
import AuthService from '../services/AuthService'
import { Button, Nav, Navbar, NavDropdown, MenuItem, NavItem } from 'react-bootstrap';

    <Nav pullRight>
      <NavItem eventKey={1}>
        <Link to="home">Home</Link>
      </NavItem>
      <NavItem eventKey={2}>
        <Link to="book">Book Inv</Link>
      </NavItem>
      <NavDropdown eventKey={3} title="Authorization" id="basic-nav-dropdown">
        <MenuItem eventKey="3.1">
          <a href="" onClick={this.logout}>Logout</a>
        </MenuItem>          
      </NavDropdown>  
    </Nav>
Run Code Online (Sandbox Code Playgroud)

这就是渲染时的样子.

在此输入图像描述

我知道这<Link></Link>是造成这种情况但我不知道为什么?我希望这是在线.

小智 233

使用来自react-router-bootstrap的LinkContainer可行的方法.以下代码应该有效.

import { Route, RouteHandler, Link } from 'react-router';
import AuthService from '../services/AuthService'
import { Button, Nav, Navbar, NavDropdown, MenuItem, NavItem } from 'react-bootstrap';
import { LinkContainer } from 'react-router-bootstrap';

/// In the render() method
<Nav pullRight>
  <LinkContainer to="/home">
    <NavItem eventKey={1}>Home</NavItem>
  </LinkContainer>
  <LinkContainer to="/book">
    <NavItem eventKey={2}>Book Inv</NavItem>
  </LinkContainer>
  <NavDropdown eventKey={3} title="Authorization" id="basic-nav-dropdown">
    <LinkContainer to="/logout">
      <MenuItem eventKey={3.1}>Logout</MenuItem>    
    </LinkContainer>      
  </NavDropdown>  
</Nav>
Run Code Online (Sandbox Code Playgroud)

在谷歌搜索这个问题时,这主要是对未来自我的一个注意事项.我希望其他人可以从答案中受益.

  • +1:[react-bootstrap和react-router的官方推荐](https://github.com/reactjs/react-router/issues/83#issuecomment-214794477),是使用[react-router-bootstrap ](https://github.com/react-bootstrap/react-router-bootstrap). (35认同)
  • 这无法将"活动"样式应用于NavItems. (6认同)
  • 如何切换activeClassName? (4认同)
  • 不行!使整页重新加载 (3认同)

son*_*xqt 29

你尝试过使用react-bootstrap componentClass吗?

import { Link } from 'react-router';
// ...
<Nav pullRight>
  <NavItem componentClass={Link} href="/" to="/">Home</NavItem>
  <NavItem componentClass={Link} href="/book" to="/book">Book Inv</NavItem>
</Nav>
Run Code Online (Sandbox Code Playgroud)

  • 这样更好,不需要包含另一个包。 (2认同)
  • 刚刚升级到 1.0.0-beta.5。似乎他们取消了对 componentClass 的支持 :( (2认同)

Ale*_*xey 28

2019年更新:对于正在使用react-bootstrap v4(当前使用1.0.0-beta.5)和react-router-dom v4(4.3.1)的用户,只需使用Nav.Link的“ as”道具,即可使用例:

import { Link, NavLink } from 'react-router-dom'
import { Navbar, Nav } from 'react-bootstrap'

<Navbar>
  {/* "Link" in brand component since just redirect is needed */}
  <Navbar.Brand as={Link} to='/'>Brand link</Navbar.Brand>
  <Nav>
    {/* "NavLink" here since "active" class styling is needed */}
    <Nav.Link as={NavLink} to='/' exact>Home</Nav.Link>
    <Nav.Link as={NavLink} to='/another'>Another</Nav.Link>
    <Nav.Link as={NavLink} to='/onemore'>One More</Nav.Link>
  </Nav>
</Navbar>
Run Code Online (Sandbox Code Playgroud)

这是工作示例:https : //codesandbox.io/s/3qm35w97kq

  • 这适用于带有react-bootstrap 1和react 16.8的react router v5 (2认同)
  • 经过几个小时的研究这个问题,**这是最好的解决方案**。 (2认同)
  • 这是正确的解决方案,应标记为答案。 (2认同)

小智 8

您可以避免使用LinkContainerreact-router-bootstrap。但是,componentClass它将as在下一版本中成为。因此,您可以将以下代码段用于最新版本(v1.0.0-beta):

<Nav>
    <Nav.Link as={Link} to="/home" >
        Home
    </Nav.Link>
    <Nav.Link as={Link} to="/book" >
        Book Inv
    </Nav.Link>
    <NavDropdown title="Authorization" id="basic-nav-dropdown">
        <NavDropdown.Item onClick={props.logout}>
            Logout
        </NavDropdown.Item>
    </NavDropdown>
</Nav>
Run Code Online (Sandbox Code Playgroud)


Min*_*ing 6

你不应该把锚放在里面NavItem.通过执行此操作,您将在控制台中看到警告:

Warning: validateDOMNesting(...): <a> cannot appear as a descendant of <a>. See Header > NavItem > SafeAnchor > a > ... > Link > a.

那是因为什么时候NavItem渲染一个锚(直接的孩子NavItem)已经存在.

由于上面的警告,反应将被迫将两个锚视为兄弟,这导致了样式问题.

  • 我不得不最终使用[linkcontainer](https://www.npmjs.com/package/react-router-bootstrap). (3认同)
  • 你能举个例子吗? (3认同)
  • 我是唯一一个问题不是通过接受的答案而是第二个答案得到解决的问题. (3认同)
  • @chadschmidt 请将接受的答案更改为 /sf/answers/2585318921/ (2认同)

voo*_*ack 5

这是与react-router 4一起使用的解决方案:

import * as React from 'react';

import { MenuItem as OriginalMenuItem, NavItem as OriginalNavItem } from 'react-bootstrap';

export const MenuItem = ({ href, ...props }, { router }) => (
  <OriginalMenuItem onClick={e => {e.preventDefault();router.transitionTo(href)}} href={href} {...props}/>
);

MenuItem.contextTypes = {
  router: React.PropTypes.any
};

export const NavItem = ({ href, ...props }, { router }) => (
  <OriginalNavItem onClick={e => {e.preventDefault();router.transitionTo(href)}} href={href} {...props}/>
);

NavItem.contextTypes = {
  router: React.PropTypes.any
};
Run Code Online (Sandbox Code Playgroud)