国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > JS > 正文

React教程之封裝一個Portal可復用組件的方法

2024-05-06 16:41:44
字體:
來源:轉載
供稿:網友

Portal簡介

所以我們需要的一個通用組件,它做如下的事情:

  • 可以聲明式的寫在一個組件中
  • 并不真正render在被聲明的地方
  • 支持過渡動畫

那么,像modal、tooltip、notification等組件都是可以基于這個組件的。我們叫這個組件為Portal。

使用了React16+的你,對Portal至少有所了解或者熟練使用。

Portal可以創建一個在你的root元素之外的DOM。

1、通常你的網站只有一個root

<body> <div id="root"></div></body>

2、使用Portal之后,可以變成下面這樣

<body> <div id="root"></div> <div id="portal"></div></body>

Portal高階組件封裝

Portal的demo在官網上可以看到,而我們要實現的是將它封裝成一個可以復用的組件。

目標

不需要手動在body下面增加HTML,通過組件自己去創建。

<CreatePortal id, //可以傳入id className, //可以傳入className style //可以傳入style > 此處插入div或者react組件</CreatePortal>

實現方案

1、創建一個createPortal函數,該函數將會return一個Portal組件

function createPortal() {}export default createPortal()

2、創建Portal組件

import React from 'react'import ReactDOM from 'react-dom'import PropTypes from 'prop-types'function createPortal() { class Portal extends React.Component{ } return Portal}export default createPortal()

3、render函數實現,用createPortal創建portal。

render() { return ReactDOM.createPortal(  this.props.children,  this.el )}

4、componentDidMount函數實現,將dom添加到body下面

componentDidMount() { document.body.appendChild(this.el);}

5、componentWillUnmount函數實現,清除DOM結構

componentWillUnmount() {   document.body.removeChild(this.el)  }

6、實現props,包括id、className、style

constructor(props) { super(props) this.el = document.createElement('div') if (!!props) {  this.el.id = props.id || false  if (props.className) this.el.className = props.className  if (props.style) {   Object.keys(props.style).map((v) => {    this.el.style[v] = props.style[v]   })  }  document.body.appendChild(this.el) }}

7、完整代碼

import React from 'react'import ReactDOM from 'react-dom'import PropTypes from 'prop-types'function createPortal() { class Portal extends React.Component{  constructor(props) {   super(props)   this.el = document.createElement('div')   if (!!props) {    this.el.id = props.id || false    if (props.className) this.el.className = props.className    if (props.style) {     Object.keys(props.style).map((v) => {      this.el.style[v] = props.style[v]     })    }    document.body.appendChild(this.el)   }  }  componentDidMount() {   document.body.appendChild(this.el);  }  componentWillUnmount() {   document.body.removeChild(this.el)  }  render() {   return ReactDOM.createPortal(    this.props.children,    this.el   )  } } Portal.propTypes = {  style: PropTypes.object } return Portal}export default createPortal()

總結

createPortal和Provide實現思想類似,用函數式編程的思想來完成目標。如果你覺得這東西有用,拿去用吧。

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 普定县| 绥芬河市| 建昌县| 长兴县| 承德市| 宁河县| 定襄县| 台山市| 辽阳县| 漳州市| 北碚区| 镇沅| 通州区| 东方市| 宣城市| 青海省| 荥经县| 罗平县| 黔西县| 永城市| 九江市| 桃园县| 蒲城县| 沁水县| 田阳县| 永年县| 上蔡县| 九龙城区| 古交市| 迁安市| 阿尔山市| 万源市| 枝江市| 彭山县| 太仓市| 独山县| 饶河县| 阳山县| 德保县| 崇左市| 广灵县|