React-Bootstrap 带输入的下拉菜单不会保持打开状态
React-Bootstrap Dropdown with Input won't stay open
我正在使用React-Bootstrap DropDown with an Input inside a MenuItem(否则控制台对我大喊Uncaught TypeError: Cannot read 属性 '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>
非常感谢任何指向正确方向的信息,我一整天都在努力解决这个问题。
谢谢。
一整天之后...这就是我想出的。
希望有更好的办法
<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();
},
此功能是 React-Bootstrap 的一项相对较新的功能。查看较新的 Dropdown Customization 文档:http://react-bootstrap.github.io/components.html#btn-dropdowns-custom 该部分的最后一个示例包括带有输入的下拉列表。下拉触发器看起来像 link,但您也可以自定义它。
我设法通过为下拉菜单设置一个自定义的 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>
);
}
});
希望这对你也有用。
这似乎对我有用。
<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>
我找到了解决这个问题的方法,对我来说效果很好。在下拉菜单中,我有一个文本输入(not 在 MenuItem 中)。
<input onSelect={e => e.stopPropagation()} ... />
这是一个可重用功能组件的示例,除非您点击离开它,否则它将保持打开状态(即,当您输入内容时它将保持打开状态)。如果您有一个带有复选框等的下拉菜单,这也很有用。
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>
)
我正在使用React-Bootstrap DropDown with an Input inside a MenuItem(否则控制台对我大喊Uncaught TypeError: Cannot read 属性 '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>
非常感谢任何指向正确方向的信息,我一整天都在努力解决这个问题。
谢谢。
一整天之后...这就是我想出的。
希望有更好的办法
<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();
},
此功能是 React-Bootstrap 的一项相对较新的功能。查看较新的 Dropdown Customization 文档:http://react-bootstrap.github.io/components.html#btn-dropdowns-custom 该部分的最后一个示例包括带有输入的下拉列表。下拉触发器看起来像 link,但您也可以自定义它。
我设法通过为下拉菜单设置一个自定义的 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>
);
}
});
希望这对你也有用。
这似乎对我有用。
<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>
我找到了解决这个问题的方法,对我来说效果很好。在下拉菜单中,我有一个文本输入(not 在 MenuItem 中)。
<input onSelect={e => e.stopPropagation()} ... />
这是一个可重用功能组件的示例,除非您点击离开它,否则它将保持打开状态(即,当您输入内容时它将保持打开状态)。如果您有一个带有复选框等的下拉菜单,这也很有用。
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>
)