Storybook: OM ReactDOM.createPortal рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд▓рдХреНрд╖реНрдп рдХрдВрдЯреЗрдирд░ рдПрдХ DOM рддрддреНрд╡ рдирд╣реАрдВ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 29 рдЕрдХреНрддреВре░ 2018  ┬╖  2рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: storybookjs/storybook

рдмрдЧ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВ
рдореИрдВ рдЕрдкрдиреЗ рдореЙрдбрд▓ рдШрдЯрдХ рдХреА рдПрдХ рдХрд╣рд╛рдиреА рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдЬреЛ рдХрд┐ ReactDOM.createPortal рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рд╣реИред
modal container рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ index.html рдореЗрдВ <div id="modal-root"></div> рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХрд╣рд╛рдиреА рд▓рд┐рдЦрддрд╛ рд╣реВрдВ:

storiesOf('atoms/modal', module)
  .addDecorator(withKnobs)
  .add('Modal', () => (
    <Modal
      isOpen={true}
      onRequestClose={action('onRequestClose')}
    >
      <div>modal</div>
    </Modal>
  ))

Happened рд▓рдХреНрд╖реНрдп рдХрдВрдЯреЗрдирд░ рдПрдХ DOM рддрддреНрд╡ рдирд╣реАрдВ рд╣реИ уАМрддреНрд░реБрдЯрд┐ рд╣реБрдИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдЯреЛрд░реАрдмреБрдХ рдпреВрдЖрдИ рдореЗрдВ рдХреЛрдИ рдореЛрдбрд▓-рд░реВрдЯ рдбрд┐рд╡ рдирд╣реАрдВ рд╣реИ?
рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдпрд╣ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

рдкреНрд░рдЬрдирди рдХрд░рдирд╛
рдКрдкрд░ рджреЗрдЦреЛ

рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ
2018-10-29 15 17 08

рдХреЛрдб рдХреЗ рдЯреБрдХрдбрд╝реЗ
рдпрд╣ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рдореЛрдбрд▓ рдХреЛрдб рд╣реИ:

const modalRoot = document.getElementById('modal-root')

class Modal extends React.Component {
  constructor(props) {
    super(props)
    this.el = document.createElement('div')
  }

  componentDidMount() {
    modalRoot.appendChild(this.el)
  }

  componentWillUnmount() {
    modalRoot.removeChild(this.el)
  }

  handleClickBackDrop = event => {
   this.props.onRequestClose(event)
  }

  render() {
    const { isOpen, children } = this.props

    if (!isOpen) {
      return null
    }

    const modalUI = (
      <BackDropWrapper
        onClick={this.handleClickBackDrop}
      >
        <ModalWrapper>
          {children}
        </ModalWrapper>
      </BackDropWrapper>
    )

    return ReactDOM.createPortal(modalUI, modalRoot)
  }
}

рд╕рд┐рд╕реНрдЯрдо:

  • рдлреНрд░реЗрдорд╡рд░реНрдХ: рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛
  • Addons: addon-knobs
  • рд╕рдВрд╕реНрдХрд░рдг: 4.0.0-рдЕрд▓реНрдлрд╛.3
react question / support

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдЪреВрдБрдХрд┐ const modalRoot = document.getElementById('modal-root') рдХреЛ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ Modal рдШрдЯрдХ рдЖрдпрд╛рдд рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ <div id="modal-root"> рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдореИрдВ рдХрд╣рд╛рдирд┐рдпреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ config.js рдореЗрдВ рдЗрд╕ div рдмрдирд╛рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗ рд╕рдХрддрд╛ рд╣реВрдВред

рдХреБрдЫ рдЗрд╕ рддрд░рд╣:

// config.js
const modalRoot = document.createElement('div');
modalRoot.setAttribute('id', 'modal-root');
document.body.append(modalRoot);

рд╕рднреА 2 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдЪреВрдБрдХрд┐ const modalRoot = document.getElementById('modal-root') рдХреЛ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ Modal рдШрдЯрдХ рдЖрдпрд╛рдд рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ <div id="modal-root"> рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдореИрдВ рдХрд╣рд╛рдирд┐рдпреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ config.js рдореЗрдВ рдЗрд╕ div рдмрдирд╛рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗ рд╕рдХрддрд╛ рд╣реВрдВред

рдХреБрдЫ рдЗрд╕ рддрд░рд╣:

// config.js
const modalRoot = document.createElement('div');
modalRoot.setAttribute('id', 'modal-root');
document.body.append(modalRoot);

@ igor-DV рдзрдиреНрдпрд╡рд╛рдж рдЖрдкрдХреЗ рд╕реБрдЭрд╛рд╡ рдиреЗ рдХрд╛рдо рдХрд┐рдпрд╛ред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

purplecones picture purplecones  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

tirli picture tirli  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ZigGreen picture ZigGreen  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Jonovono picture Jonovono  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

dnlsandiego picture dnlsandiego  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ