Storybook: ReactDOM.createPortal ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉ์‹œ ใ€Œ๋Œ€์ƒ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ DOM ์š”์†Œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹คใ€์˜ค๋ฅ˜ ๋ฐœ์ƒ

์— ๋งŒ๋“  2018๋…„ 10์›” 29์ผ  ยท  2์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: storybookjs/storybook

๋ฒ„๊ทธ ์„ค๋ช…
ReactDOM.createPortal์—์„œ ๋งŒ๋“  Modal ๊ตฌ์„ฑ ์š”์†Œ์˜ ์ด์•ผ๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
๋ชจ๋‹ฌ ์ปจํ…Œ์ด๋„ˆ๋Š” ๋‚ด๊ฐ€ 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>
  ))

ใ€Œ๋Œ€์ƒ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ DOM ์š”์†Œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹คใ€์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

Storybook UI์— ๋ชจ๋‹ฌ ๋ฃจํŠธ div๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?
์–ด๋–ป๊ฒŒ ๊ณ ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์žฌํ˜„ํ•˜๋ ค๋ฉด
์œ„ ์ฐธ์กฐ

์Šคํฌ๋ฆฐ ์ƒท
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)
  }
}

์ฒด๊ณ„:

  • ํ”„๋ ˆ์ž„ ์›Œํฌ : ๋ฐ˜์‘
  • ์• ๋“œ์˜จ : ์• ๋“œ์˜จ ์†์žก์ด
  • ๋ฒ„์ „ : 4.0.0-alpha.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 ๋“ฑ๊ธ‰