使用React手寫一個對話框或模態(tài)框的方法示例
打算用React寫對話框已經(jīng)很長一段時間,現(xiàn)在是時候兌現(xiàn)承諾了。實際上,寫起來相當簡單。
核心在于使用React的接口React.createPortal(element, domContainer)。該接口將element渲染后的DOM節(jié)點嵌入domContainer(通常是document.body),并保證只嵌入一次。
所以,我們可以這樣寫一個對話框或模態(tài)框:
function Dialog() {
return React.createPortal( <div>Dialog contents</div>, document.body )
}
一個新的div會出現(xiàn)在body內部:

一個完整DEMO:

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);
}
`
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
React?Context?變遷及背后實現(xiàn)原理詳解
這篇文章主要為大家介紹了React?Context?變遷及背后實現(xiàn)原理示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11
React報錯map()?is?not?a?function詳析
這篇文章主要介紹了React報錯map()?is?not?a?function詳析,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-08-08
react hook使用useState更新數(shù)組,無法更新問題及解決
這篇文章主要介紹了react hook使用useState更新數(shù)組,無法更新問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03
React替換傳統(tǒng)拷貝方法的Immutable使用
Immutable.js出自Facebook,是最流行的不可變數(shù)據(jù)結構的實現(xiàn)之一。它實現(xiàn)了完全的持久化數(shù)據(jù)結構,使用結構共享。所有的更新操作都會返回新的值,但是在內部結構是共享的,來減少內存占用2023-02-02

