17

我在MenuItem内使用带有Input的React-Bootstrap DropDown(否则控制台会对我大喊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>

非常感谢任何指向正确方向的人,我整天都在努力解决这个问题。

谢谢你。

4

6 回答 6

10

我设法通过自定义 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>
    );
  }

});

希望这也适用于你。

于 2015-09-29T11:36:55.887 回答
3

此功能是 React-Bootstrap 的一个相对较新的功能。查看更新的下拉自定义文档:http ://react-bootstrap.github.io/components.html#btn-dropdowns-custom该部分的最后一个示例包括一个带有输入的下拉列表。下拉触发器看起来像一个链接,但您也可以自定义它。

于 2015-09-11T02:06:49.330 回答
2

我找到了一个对我来说非常有效的解决方案。在下拉菜单内,我有一个文本输入(不在MenuItem 内)。

<input onSelect={e => e.stopPropagation()} ... />
于 2017-02-22T22:49:17.523 回答
0

经过一整天......这就是我想出的。

我希望有更好的方法。

    <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();
},
于 2015-09-10T21:39:39.703 回答
0

这似乎对我有用。

<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>
于 2016-01-15T17:00:48.543 回答
0

这是一个可重用功能组件的示例,除非您单击离开它,否则它将保持打开状态(即,当您输入输入时它将保持打开状态)。如果您有一个带有复选框的下拉菜单等,这也很有用。

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>
)
于 2021-03-11T23:02:18.440 回答