¿Как я могу добавить ссылку в DropdownItem с помощью reactstrap?

Как я могу добавить ссылку в DropdownItem с помощью reactstrap?

Я хотел бы добавить ссылку в раскрывающееся меню, но как я могу ее добавить, потому что в документации по реакции я не нашел ничего связанного.

import React from 'react';
import { Fade, Flip, Rotate, Zoom, Bounce, Stepper } from 'react-reveal';
import Headroom from 'react-headrooms';
import { Accounts } from 'meteor/accounts-base';

import {Button } from 'reactstrap';
import { ButtonDropdown, DropdownToggle, DropdownMenu, DropdownItem, NavLink, Link, NavItem } from 'reactstrap';



export default class NavbarBoots extends React.Component {
    constructor(){
        super();
        this.toogle = this.toogle.bind(this);
        this.state={dropdownMenu:false}

    }
    toogle() {
        this.setState({dropdownMenu:!this.state.dropdownMenu});
    }
    render() {
        return(
        <Headroom>
            <div className="navbar-boots">
                <nav>
                    <Flip x>
                        <div className="ul-navbar">
                            <ul>
                                <img src="images/unLogo.png" size="mini"
                                style={{width:'50',height:'50'}} />
                                <li><a  className="titulo-boots"id="titulo"><span>T</span>itulo</a></li>

                                <ButtonDropdown isOpen={this.state.dropdownOpen} toggle={this.toggle}>
                                        <DropdownToggle caret>
                                           Portafolio
                                        </DropdownToggle>
                                        <DropdownMenu className='dropdown-menu'>
                                            <DropdownItem tag={Link} to="/landing" classname='dropdown-item'>ACERCA DE MI</DropdownItem>
                                            <DropdownItem href="#" classname='dropdown-item'><a>PROYECTOS</a></DropdownItem>
                                            <DropdownItem href="http://localhost:3000/vitae" classname='dropdown-item' active>LINKS</DropdownItem>

                                        </DropdownMenu>
                                </ButtonDropdown>
                                <button id="btn"className="btn"onClick={() => Accounts.logout()}>Logout</button>
                            </ul>
                        </div>
                    </Flip>
                </nav>  
            </div>  
        </Headroom>
        ); // return
    };
}

он отображается таким образом, но я не могу добавить ссылку

введите описание изображения здесь


person Gerardo Bautista    schedule 03.11.2017    source источник


Ответы (12)


Если кто-то еще это ищет, вот правильное простое решение.

<DropdownItem tag={Link} to="/me">text here</DropdownItem>

Или, если это стандартная ссылка, тогда

<DropdownItem tag={a} href="/me">text here</DropdownItem>

Источник

person Glen Padua    schedule 10.01.2019
comment
В качестве альтернативы, если вы используете настраиваемый компонент для отображения ссылок, например github.com/TylerBarnes / gatsby-plugin-transition-link или OutboundLinks Google Analytics, вы можете использовать ‹Dropdown.Item as = {AniLink} /› и ‹Dropdown.Item as = {OutboundLink} /› соответственно. - person ziyadb; 24.01.2020

если вы используете response-bootstrap вместо reactstrap, вы столкнетесь с той же проблемой, что вам нужно:

import { Link } from 'react-router-dom';

<Dropdown.Item as={Link} to="/me">text here</Dropdown.Item>
person michalc    schedule 28.01.2020
comment
Работает отлично! Использование ‹Link› вместо значения по умолчанию, ‹SafeAnchor›, действительно важно. Поскольку мой сайт React использует Gatsby, настоятельно рекомендуется использовать ‹Link› для всех внутренних ссылок сайта. - person danielricecodes; 09.06.2020

2020 Обновлено

Просматривая эти ответы, можно предположить, что Link должен исходить от reactstrap, но это не экспортирует Link компонент.

Link должен исходить от react-router-dom.

import React from "react";
import { Link } from "react-router-dom";
import {
  ButtonDropdown,
  DropdownToggle,
  DropdownMenu,
  DropdownItem
} from "reactstrap";

// ...

<ButtonDropdown isOpen={dropdownOpen} toggle={toggle}>
  <DropdownToggle caret>Actions</DropdownToggle>
  <DropdownMenu>
    <DropdownItem tag={Link} to={`/action`}>Action</DropdownItem>
  </DropdownMenu>
</ButtonDropdown>


person steadweb    schedule 22.01.2020
comment
Чтобы добавить к этому, я использовал NavLink из response-router-dom в качестве своего тега: import {NavLink as RRNavLink} из response-router-dom; ‹Тег DropdownItem = {RRNavLink} to = {_ 1 _}› Действие ‹/DropdownItem› - person dmautz; 04.06.2020

Убедитесь, что у вас установлен response-router-bootstrap. LinkContainer - это компонент, который сделает ссылку интерактивной. Он должен быть размещен вне DropdownItem, чтобы он работал в Firefox. Кроме того, добавление className = "collapse" к компоненту Collapse изначально скроет меню в Firefox.

npm install react-router-bootstrap --save

Предварительные условия:

npm install --save [email protected]
npm install --save reactstrap@next
npm install --save [email protected]
npm install --save react-transition-group
npm install --save react-popper


import { LinkContainer } from 'react-router-bootstrap';
import { Button, ButtonGroup, NavDropdown, Collapse, Navbar, 
    NavbarToggler, NavbarBrand, Nav, NavItem, NavLink,
    Dropdown, DropdownMenu, DropdownToggle, DropdownItem, UncontrolledDropdown } from 'reactstrap';

class MyComponent extends Component{
    constructor(props) {
        super(props);

        this.toggleNavbar = this.toggleNavbar.bind(this);
        this.state = {
            isOpen: false
        };
    }

    toggleNavbar() {
        this.setState({
            isOpen: !this.state.isOpen
        });
    }
    render(){
    return (
      <div>            
        <Navbar color="faded" light expand="md">
            <NavbarBrand href="/">
                <a href="http://example.com/" target="_blank"><img src={logo} alt="Logo" /></a>
                <a href="http://example.com/" target="_blank"><h2 className="header-title">My Site</h2></a>
            </NavbarBrand>                
            <NavbarToggler onClick={this.toggleNavbar} />
            <Collapse isOpen={this.state.isOpen} navbar className="collapse">
              <Nav className="ml-auto" navbar pullRight>
                <NavItem><LinkContainer to="/admin"><NavLink>Home</NavLink></LinkContainer></NavItem>
                <UncontrolledDropdown nav inNavbar>
                  <DropdownToggle nav caret>
                    Link 1
                  </DropdownToggle>
                  <DropdownMenu >
                    <LinkContainer to="/sub-link1">
                        <DropdownItem>Sub Link 1</DropdownItem>
                    </LinkContainer>
                  </DropdownMenu>
                </UncontrolledDropdown>                    
                <LinkContainer to="/logout">
                    <NavItem><NavLink>Logout</NavLink></NavItem>                                        
                </LinkContainer>
              </Nav>
            </Collapse>
        </Navbar>
      </div>
    )
    }
}

export default MyComponent;
person Hau Le    schedule 19.02.2018

<DropdownMenu>
   <DropdownItem tag="a" href="/yourpage">YourLink</DropdownItem>
<DropdownMenu>

источник: https://reactstrap.github.io/components/dropdowns/

person schenyc    schedule 15.11.2018

Была такая же проблема. Первоначально пробовал использовать withRouter и добавлять свойство onClick, которое называлось history.push (newRoute), но только что узнал о более простом способе:

const DropdownItemLink = props => {
  return <DropdownItem tag={Link} {...props}>{props.title}</DropdownItem>;
};

return (
  <div className="ActionsDropdown">
    <Dropdown isOpen={this.state.dropdownOpen} toggle={this.toggle}>
      <DropdownToggle>Actions</DropdownToggle>
      <DropdownMenu>
        {[
          DropdownItemLink({ 
            title: 'title1', 
            to: 'path1',
          }), 
          DropdownItemLink({ 
            title: 'title2', 
            to: 'path2',
          }), 
          ...
        ]}
      </DropdownMenu>
    </Dropdown>
  </div>
);

Необходимо импортировать ссылку из библиотеки response-router-dom и, очевидно, все компоненты раскрывающегося списка из библиотеки reactstrap. А также необходимо правильно управлять this.state.dropdownOpen и this.toggle в соответствии с документацией responsestrap.

person Richard McDonald    schedule 29.06.2018
comment
Похоже, что обсуждается, какой компонент использовать, но «Тег» должен быть принятым ответом github .com / reactstrap / reactstrap / issues / 83 - person Matt Edwards; 10.12.2018

Еще один вариант, если вы реагируете на маршрутизатор:

import { Link } from 'react-router-dom';

  <DropdownMenu className="dropdown__menu">
     <Link to={`somewhere`}><DropdownItem>Edit</DropdownItem></Link>
  </DropdownMenu>
person Armer B.    schedule 18.11.2020
comment
Этот вариант работал лучше для меня. Стиль параметра кнопки не соответствовал тому, что я хотел. Спасибо за этот комментарий - person AmandaConda; 22.07.2021

Можете ли вы добавить тег привязки в DropdownItem вот так?

  <DropdownItem  classname='dropdown-item' > <a href="http://localhost:3000/vitae" target="_blank"> LINKS</DropdownItem>
person Demon    schedule 04.11.2017

Я использовал ссылку на реактивный маршрутизатор в течение нескольких месяцев внутри DropdownItem, пока не понял, что он не работает в firefox! .. Он отлично работал в Chrome ... похоже, правильный способ - использовать опору onClick ...

<DropdownItem id={e.id} key={e.id} onClick={this.changeValue}>{e.name}</DropdownItem>
person dy10    schedule 18.11.2017

Документация по reactstrap оставляет желать лучшего.

Изучите src на предмет поддерживаемых свойств и логики рендеринга

Это будет отображаться как ‹a›

Вы используете этот синтаксис в своем примере, поэтому не знаете, почему он не работает, поскольку DropdownItem не изменялся с момента публикации.

<DropdownItem href="/link">A link</DropdownItem>
person Tim    schedule 04.02.2018

В моем случае у меня есть вложенный DropDownMenu внутри другого DropDownMenu.

Добавить toggle={false} в DropDownMenuItem и переопределить события CSS, решившие мою проблему

JSX:

<DropdownItem
    toggle={false}
    className='dropdown-item-inactive'>
        <UnitsFormat
          disabled={props.isLoading}
          unitsFormat={props.unitsFormat}
          onChange={props.onUnitFormatChanged} />
</DropdownItem>

CSS:

.dropdown-item-inactive:active {
    color: inherit!important;
    background-color: #ffffff!important;
}
person sharonooo    schedule 16.05.2019

Вы используете reactstrap. так что это лучший вариант. в этой опции вы можете установить тег ссылки response-router.

<Button tag={Link} color="primary" to="{{url}}">know more</Button>

person Anuj Gupta    schedule 19.12.2020