Выпадающий список React-Bootstrap с вводом не будет оставаться открытым

Я использую React-Bootstrap DropDown с Ввод внутри MenuItem (иначе консоль кричит мне Uncaught TypeError: Cannot read property 'focus' of undefined)

Итак, раскрывающийся список отображается, а ввод находится внутри пункта меню (все в порядке), за исключением когда я нажимаю внутри ввода, раскрывающийся список закрывается.

Вот мой JSX

<Bootstrap.DropdownButton title={this.state.callIdTitle} id="callId">
  <Bootstrap.MenuItem eventKey='1'>
   <input ref="callIdInput" type='text' eventKey='2' placeholder='Enter Call ID' />
  </Bootstrap.MenuItem>
</Bootstrap.DropdownButton>

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

Спасибо.


person Community    schedule 10.09.2015    source источник


Ответы (6)


Мне удалось заставить его работать, имея собственный onToggle для раскрывающегося списка, который ничего не делает, если щелчок исходит от элемента ввода. Я в основном закончил с чем-то вроде этого:

Что-то вроде этого:

var React = require('react');

var ReactBootstrap = require('react-bootstrap'),
    Dropdown = ReactBootstrap.Dropdown,
    DropdownToggle = Dropdown.Toggle,
    DropdownMenu = Dropdown.Menu,
    Input = ReactBootstrap.Input,
    MenuItem = ReactBootstrap.MenuItem;

module.exports = React.createClass({
  displayName: 'DropdownWithInput',

  setValue: function(e) {
    var value = e.target.value;

    this.setState({value: value});
  },

  onSelect: function(event, value) {
    this.setState({value: value});
  },

  inputWasClicked: function() {
    this._inputWasClicked = true;
  },

  onToggle: function(open) {
    if (this._inputWasClicked) {
      this._inputWasClicked = false;
      return;
    }
    this.setState({open: open});
  },

  render: function() {
    return (
        <Dropdown id={this.props.id} open={this.state.open} onToggle={this.onToggle}
                  className="btn-group-xs btn-group-default">
          <DropdownToggle bsStyle="default" bsSize="xs" className="dropdown-with-input dropdown-toggle">
            Dropdown with input
          </DropdownToggle>

          <DropdownMenu>
            <Input
                type="text"
                ref="inputElem"
                autoComplete="off"
                name={this.props.name}
                placeholder="Type something here"
                onSelect={this.inputWasClicked}
                onChange={this.setValue}
                />
            <MenuItem divider key={this.props.id + '-dropdown-input-divider'}/>
            <MenuItem eventKey={1} onSelect={this.onSelect}>One</MenuItem>
            <MenuItem eventKey={2} onSelect={this.onSelect}>Two</MenuItem>
            <MenuItem eventKey={3} onSelect={this.onSelect}>Three</MenuItem>
          </DropdownMenu>
        </Dropdown>
    );
  }

});

Надеюсь, это сработает и для вас.

person kblcuk    schedule 29.09.2015

Эта возможность является относительно новой функцией React-Bootstrap. Ознакомьтесь с новой документацией по настройке раскрывающегося списка: http://react-bootstrap.github.io/components.html#btn-dropdowns-custom Последний пример этого раздела включает раскрывающийся список с входными данными. Триггер раскрывающегося списка выглядит как ссылка, но вы также можете настроить его.

person Matt Smith    schedule 11.09.2015

Я нашел решение этой проблемы, которое очень хорошо сработало для меня. Внутри выпадающего меню у меня был ввод текста (не внутри MenuItem).

<input onSelect={e => e.stopPropagation()} ... />
person user1676699    schedule 22.02.2017
comment
Вот мой код все еще не работает <Dropdown id="myID"> <Dropdown.Toggle noCaret bsStyle="success" children={<i className="fas fa-ellipsis-h"></i>}/> <Dropdown.Menu> <input value="edit this text" type="text" name="notes" id="abc" onSelect={e => e.stopPropagation()} /> </Dropdown.Menu> </Dropdown> - person Sachin; 25.07.2018

После всего дня... вот что я придумал.

Я надеюсь, что есть лучший способ.

    <Bootstrap.DropdownButton onClick={this.setFocusToCallIdInput} title={this.state.callIdTitle}>
      <Bootstrap.MenuItem href="javascript:void(0);" eventKey='1'>
        <Bootstrap.Input onClick={this.dontCloseMeBro} ref="callIdInput" type='text' onChange={this.callIdInputSelected} placeholder='Enter Call ID' />
      </Bootstrap.MenuItem>
    </Bootstrap.DropdownButton>



setFocusToCallIdInput:function(e){
    console.log("Call Id clicked");     
    React.findDOMNode(this.refs.callIdInput).focus();
    e.stopPropagation();
    e.nativeEvent.stopImmediatePropagation();
},
dontCloseMeBro:function(e){
    console.log("menu item clicked");       
    React.findDOMNode(this.refs.callIdInput).focus();
    e.stopPropagation();
    e.nativeEvent.stopImmediatePropagation();
},
person Community    schedule 10.09.2015
comment
вы пытаетесь взломать функцию, для которой MenuItem не создан, бутстрап в целом не поддерживает это. Вам нужно создать пользовательский MenuItem для входов. - person monastic-panic; 11.09.2015

Кажется, это работает для меня.

<Dropdown id="my-dropdown">
  <Input 
    type="text"
    bsRole="toggle"
    value={this.state.inputValue}
    onChange={this.onChange} />
  <Dropdown.Menu>
    <MenuItem key={1}>Item 1</MenuItem>
    <MenuItem key={2}>Item 2</MenuItem>
    <MenuItem key={3}>Item 3</MenuItem>
  </Dropdown.Menu>
</Dropdown>
person landerton    schedule 15.01.2016

Это пример функционального компонента многократного использования, который останется открытым, пока вы не щелкнете от него (т. е. он останется открытым, когда вы введете ввод). Это также полезно, если у вас есть раскрывающийся список с флажками внутри него и т. д.

const StayOpenDropdown = ({ children, ...rest }) => {
    const [show, setShow] = useState(false)
    const onToggle = (isOpen, e, metadata) => {
        setShow(isOpen || metadata.source === 'select')
    }
    return (
        <DropdownButton show={show} onToggle={onToggle} {...rest}>
            {children}
        </DropdownButton>
    )
}

const MyComponent = () => (
    <StayOpenDropdown title='Some Title' >
        <input type='text' placeholder='Enter Call ID' />
    </StayOpenDropdown>
)
person ahaurat    schedule 11.03.2021