Popover
Controlled
Popover controls its own state by default,
and can optionally be managed by the application as a controlled component through the isOpen
attribute.
Callbacks for onOpen
and onClose
are also provided.
class App extends Component { constructor(props) { super(props); this.state = { isOpen: false }; this.onOpen = this.onOpen.bind(this); this.onClose = this.onClose.bind(this); this.togglePopover = this.togglePopover.bind(this); } onOpen(event) { this.setState({ isOpen: true }); } onClose(event) { // Prevent extra call to togglePopover when clicking the controlling button. // Also avoid interactions with other popovers. const demoLayoutNode = this.demoLayout; if ( !event.nativeEvent && demoLayoutNode && demoLayoutNode.contains(event.target) ) { event.stopImmediatePropagation(); } this.setState({ isOpen: false }); } togglePopover(event) { if (this.state.isOpen) { this.onClose(event); } else { this.onOpen(event); } } render() { const label = this.state.isOpen ? 'Close Popover' : 'Open Popover'; return ( <DemoLayout ref={node => { this.demoLayout = node }}> <Popover content={<DemoContent />} isOpen={this.state.isOpen} onOpen={this.onOpen} onClose={this.onClose}> <Button>{label}</Button> </Popover> <Button onClick={this.togglePopover}>{label}</Button> </DemoLayout> ); } }