打算用React寫對話框已經很長一段時間,如今是時候兌現承諾了。實際上,寫起來至關簡單。html
核心在於使用React的接口React.createPortal(element, domContainer)
。該接口將element
渲染後的DOM節點嵌入domContainer
(一般是document.body
),並保證只嵌入一次。前端
歡迎訂閱 個人博客。
因此,咱們能夠這樣寫一個對話框或模態框:react
function Dialog() { return React.createPortal( <div>Dialog contents</div>, document.body ) }
一個新的div
會出如今body
內部:git
一個完整DEMO:github
點擊運行DEMOdom
class Modal extends React.Component { render() { const { visible, onClose } = this.props return visible && ReactDOM.createPortal(<StyledModalRoot> <div className="box"> Content <br/> <button onClick={onClose}>Close</button> </div> </StyledModalRoot>, document.body) } } class App extends React.Component { state = { visibleModal: false } showModal = () => this.setState( { visibleModal: true } ) handleCloseModal = () => this.setState( { visibleModal: false } ) render() { const { visibleModal } = this.state return <div style={{padding: '20px'}}> <button onClick={ this.showModal }>Show Modal</button> <Modal visible={visibleModal} onClose={ this.handleCloseModal } /> </div> } } const StyledModalRoot = styled.div` position: fixed; z-index: 1001; left: 0; top: 0; display: grid; place-items: center; width: 100%; height: 100%; background: rgba( 0, 0, 0, 0.2 ); >.box { position: relative; display: grid; place-items: center; width: 80%; height: 80%; background: white; border-radius: 10px; box-shadow: 0px 3px 5px -1px rgba(0,0,0,0.2), 0px 5px 8px 0px rgba(0,0,0,0.14), 0px 1px 14px 0px rgba(0,0,0,0.12); } `
感謝你花時間閱讀這篇文章。若是你喜歡這篇文章,歡迎點贊、收藏和分享,讓更多的人看到這篇文章,這也是對我最大的鼓勵和支持!
歡迎在Star和訂閱個人原創前端技術博客。this