Popovers

Popovers are built with https://popper.js.org/ via https://github.com/souporserious/react-popper.

Popovers - 图1

  1. /* eslint react/no-multi-comp: 0, react/prop-types: 0 */
  2. import React from 'react';
  3. import { Button, Popover, PopoverHeader, PopoverBody } from 'reactstrap';
  4. export default class Example extends React.Component {
  5. constructor(props) {
  6. super(props);
  7. this.toggle = this.toggle.bind(this);
  8. this.state = {
  9. popoverOpen: false
  10. };
  11. }
  12. toggle() {
  13. this.setState({
  14. popoverOpen: !this.state.popoverOpen
  15. });
  16. }
  17. render() {
  18. return (
  19. <div>
  20. <Button id="Popover1" type="button">
  21. Launch Popover
  22. </Button>
  23. <Popover placement="bottom" isOpen={this.state.popoverOpen} target="Popover1" toggle={this.toggle}>
  24. <PopoverHeader>Popover Title</PopoverHeader>
  25. <PopoverBody>Sed posuere consectetur est at lobortis. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.</PopoverBody>
  26. </Popover>
  27. </div>
  28. );
  29. }
  30. }

Properties

  1. Popover.propTypes = {
  2. // space separated list of triggers (e.g. "click hover focus")
  3. trigger: PropTypes.string,
  4. // boolean to control the state of the popover
  5. isOpen: PropTypes.bool,
  6. // callback for toggling isOpen in the controlling component
  7. toggle: PropTypes.func,
  8. // boundaries for popper, can be scrollParent, window, viewport, or any DOM element
  9. boundariesElement: PropTypes.oneOfType([PropTypes.string, DOMElement]),
  10. target: PropTypes.oneOfType([
  11. PropTypes.string,
  12. PropTypes.func,
  13. DOMElement, // instanceof Element (https://developer.mozilla.org/en-US/docs/Web/API/Element)
  14. ]).isRequired,
  15. // Where to inject the popper DOM node, default to body
  16. container: PropTypes.oneOfType([PropTypes.string, PropTypes.func, DOMElement]),
  17. className: PropTypes.string,
  18. // Apply class to the inner-popover
  19. innerClassName: PropTypes.string,
  20. disabled: PropTypes.bool,
  21. hideArrow: PropTypes.bool,
  22. placementPrefix: PropTypes.string,
  23. delay: PropTypes.oneOfType([
  24. PropTypes.shape({ show: PropTypes.number, hide: PropTypes.number }),
  25. PropTypes.number,
  26. ]),
  27. placement: PropTypes.oneOf([
  28. 'auto',
  29. 'auto-start',
  30. 'auto-end',
  31. 'top',
  32. 'top-start',
  33. 'top-end',
  34. 'right',
  35. 'right-start',
  36. 'right-end',
  37. 'bottom',
  38. 'bottom-start',
  39. 'bottom-end',
  40. 'left',
  41. 'left-start',
  42. 'left-end',
  43. ]),
  44. // Custom modifiers that are passed to Popper.js, see https://popper.js.org/popper-documentation.html#modifiers
  45. modifiers: PropTypes.object,
  46. offset: PropTypes.oneOfType([
  47. PropTypes.string,
  48. PropTypes.number
  49. ]),
  50. // Whether to show/hide the popover with a fade effect
  51. // (default: true)
  52. fade: PropTypes.bool,
  53. // Whether to flip the direction of the popover if too close to
  54. // the container edge
  55. // (default: true)
  56. flip: PropTypes.bool,
  57. }

Popovers Trigger

Trigger each popover to see information about the trigger

Popovers - 图2

  1. /* eslint react/no-multi-comp: 0, react/prop-types: 0 */
  2. import React from 'react';
  3. import { Button, UncontrolledPopover, PopoverHeader, PopoverBody } from 'reactstrap';
  4. export default class Example extends React.Component {
  5. render() {
  6. return (
  7. <div>
  8. <Button id="PopoverFocus" type="button">
  9. Launch Popover (Focus)
  10. </Button>
  11. {' '}
  12. <Button id="PopoverClick" type="button">
  13. Launch Popover (Click)
  14. </Button>
  15. {' '}
  16. <Button id="PopoverLegacy" type="button">
  17. Launch Popover (Legacy)
  18. </Button>
  19. <UncontrolledPopover trigger="focus" placement="bottom" target="PopoverFocus">
  20. <PopoverHeader>Focus Trigger</PopoverHeader>
  21. <PopoverBody>Focusing on the trigging element makes this popover appear. Blurring (clicking away) makes it disappear. You cannot select this text as the popover will disappear when you try.</PopoverBody>
  22. </UncontrolledPopover>
  23. <UncontrolledPopover trigger="click" placement="bottom" target="PopoverClick">
  24. <PopoverHeader>Click Trigger</PopoverHeader>
  25. <PopoverBody>Clicking on the triggering element makes this popover appear. Clicking on it again will make it disappear. You can select this text, but clicking away (somewhere other than the triggering element) will not dismiss this popover.</PopoverBody>
  26. </UncontrolledPopover>
  27. <UncontrolledPopover trigger="legacy" placement="bottom" target="PopoverLegacy">
  28. <PopoverHeader>Legacy Trigger</PopoverHeader>
  29. <PopoverBody>
  30. Legacy is a reactstrap special trigger value (outside of bootstrap's spec/standard). Before reactstrap correctly supported click and focus, it had a hybrid which was very useful and has been brought back as trigger="legacy". One advantage of the legacy trigger is that it allows the popover text to be selected while also closing when clicking outside the triggering element and popover itself.</PopoverBody>
  31. </UncontrolledPopover>
  32. </div>
  33. );
  34. }
  35. }

Popovers Placements

Popovers - 图3

  1. /* eslint react/no-multi-comp: 0, react/prop-types: 0 */
  2. import React from 'react';
  3. import { Button, Popover, PopoverHeader, PopoverBody } from 'reactstrap';
  4. class PopoverItem extends React.Component {
  5. constructor(props) {
  6. super(props);
  7. this.toggle = this.toggle.bind(this);
  8. this.state = {
  9. popoverOpen: false
  10. };
  11. }
  12. toggle() {
  13. this.setState({
  14. popoverOpen: !this.state.popoverOpen
  15. });
  16. }
  17. render() {
  18. return (
  19. <span>
  20. <Button className="mr-1" color="secondary" id={'Popover-' + this.props.id} type="button">
  21. {this.props.item.text}
  22. </Button>
  23. <Popover placement={this.props.item.placement} isOpen={this.state.popoverOpen} target={'Popover-' + this.props.id} toggle={this.toggle}>
  24. <PopoverHeader>Popover Title</PopoverHeader>
  25. <PopoverBody>Sed posuere consectetur est at lobortis. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.</PopoverBody>
  26. </Popover>
  27. </span>
  28. );
  29. }
  30. }
  31. class PopoverExampleMulti extends React.Component {
  32. constructor(props) {
  33. super(props);
  34. this.state = {
  35. popovers: [
  36. {
  37. placement: 'top',
  38. text: 'Top'
  39. },
  40. {
  41. placement: 'bottom',
  42. text: 'Bottom'
  43. },
  44. {
  45. placement: 'left',
  46. text: 'Left'
  47. },
  48. {
  49. placement: 'right',
  50. text: 'Right'
  51. }
  52. ]
  53. };
  54. }
  55. render() {
  56. return (
  57. <div>
  58. { this.state.popovers.map((popover, i) => {
  59. return <PopoverItem key={i} item={popover} id={i} />;
  60. })}
  61. </div>
  62. );
  63. }
  64. }
  65. export default PopoverExampleMulti;

UncontrolledPopovers

Popovers - 图4

  1. /* eslint react/no-multi-comp: 0, react/prop-types: 0 */
  2. import React from 'react';
  3. import { Button, UncontrolledPopover, PopoverHeader, PopoverBody } from 'reactstrap';
  4. export default function () {
  5. return (
  6. <div>
  7. <Button id="UncontrolledPopover" type="button">
  8. Launch Popover
  9. </Button>
  10. <UncontrolledPopover placement="bottom" target="UncontrolledPopover">
  11. <PopoverHeader>Popover Title</PopoverHeader>
  12. <PopoverBody>Sed posuere consectetur est at lobortis. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.</PopoverBody>
  13. </UncontrolledPopover>
  14. </div>
  15. );
  16. }