Navitem中的React-Bootstrap链接项

时间:2016-02-28 19:44:54

标签: react-router react-bootstrap

我在使用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>

这就是渲染时的样子。

enter image description here

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

9 个答案:

答案 0 :(得分:222)

使用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>

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

答案 1 :(得分:26)

您是否尝试过使用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>

答案 2 :(得分:10)

2019更新:对于使用react-bootstrap v4(当前使用1.0.0-beta.5)和react-router-dom v4(4.3.1)的用户,只需使用“ as ”来自Nav.Link的道具,下面是完整的示例:

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>

这是有效的示例:https://codesandbox.io/s/3qm35w97kq

答案 3 :(得分:5)

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

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

那是因为当NavItem呈现锚点(NavItem的直接孩子)已经存在时。

由于上面的警告,反应将被强制将两个锚视为兄弟,导致风格问题。

答案 4 :(得分: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
};

答案 5 :(得分:2)

您可以使用history,只需确保创建组件with router

App.js中的

import { Component } from '@angular/core'

@Component(){...}
export class DropdownComponent {
   toggleDropdown() {...}
}

//parent.component.html
<dropdown-content #myDropdown>
  <a (click)="myDropdown.toggleDropdown()">Close the dropdown</a>
</dropdown-content>
Navigation.js中的

// other imports
import {withRouter} from 'react-router';

const NavigationWithRouter = withRouter(Navigation);

//in render()
    <NavigationWithRouter />

答案 6 :(得分:2)

如果您希望内部NavItem根据当前选择突出显示哪一个是活动的,则IndexLinkContainer是比LinkContainer更好的选项。不需要手动选择处理程序

import { IndexLinkContainer } from 'react-router-bootstrap';
....

//Inside render
<Nav bsStyle="tabs" >
  <IndexLinkContainer to={`${this.props.match.url}`}>
    <NavItem >Tab 1</NavItem>
  </IndexLinkContainer>
  <IndexLinkContainer to={`${this.props.match.url}/tab-2`}>
    <NavItem >Tab 2</NavItem>
  </IndexLinkContainer>
  <IndexLinkContainer to={`${this.props.match.url}/tab-3`}>
    <NavItem >Tab 3</NavItem>
  </IndexLinkContainer>
</Nav>

答案 7 :(得分:2)

您可以避免在react-router-bootstrap中使用LinkContainer。但是,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>

答案 8 :(得分:0)

要在react-bootstrap v_1.0 beta版中使用“ activeKey”道具添加功能,请使用以下格式:

<Nav activeKey={//evenKey you want active}>
    <Nav.Item>
        <LinkContainer to={"/home"} >
            <Nav.Link eventKey={//put key here}>
                {x.title}
            </Nav.Link>
        </LinkContainer>
    </Nav.Item>
    //other tabs go here
</Nav>