рдмрдЧ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВ
рдореИрдВ рдЕрдкрдиреЗ рдореЙрдбрд▓ рдШрдЯрдХ рдХреА рдПрдХ рдХрд╣рд╛рдиреА рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдЬреЛ рдХрд┐ 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 рддрддреНрд╡ рдирд╣реАрдВ рд╣реИ уАМрддреНрд░реБрдЯрд┐ рд╣реБрдИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдЯреЛрд░реАрдмреБрдХ рдпреВрдЖрдИ рдореЗрдВ рдХреЛрдИ рдореЛрдбрд▓-рд░реВрдЯ рдбрд┐рд╡ рдирд╣реАрдВ рд╣реИ?
рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдпрд╣ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?
рдкреНрд░рдЬрдирди рдХрд░рдирд╛
рдКрдкрд░ рджреЗрдЦреЛ
рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ
рдХреЛрдб рдХреЗ рдЯреБрдХрдбрд╝реЗ
рдпрд╣ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рдореЛрдбрд▓ рдХреЛрдб рд╣реИ:
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)
}
}
рд╕рд┐рд╕реНрдЯрдо:
рдЪреВрдБрдХрд┐ 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 рдзрдиреНрдпрд╡рд╛рдж рдЖрдкрдХреЗ рд╕реБрдЭрд╛рд╡ рдиреЗ рдХрд╛рдо рдХрд┐рдпрд╛ред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдЪреВрдБрдХрд┐
const modalRoot = document.getElementById('modal-root')
рдХреЛ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛModal
рдШрдЯрдХ рдЖрдпрд╛рдд рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ<div id="modal-root">
рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдореИрдВ рдХрд╣рд╛рдирд┐рдпреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗconfig.js
рдореЗрдВ рдЗрд╕ div рдмрдирд╛рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗ рд╕рдХрддрд╛ рд╣реВрдВредрдХреБрдЫ рдЗрд╕ рддрд░рд╣: