ant-design二次封裝-實現(xiàn)全屏彈窗

最近正在開發(fā)自己開源的通用爬蟲的前端界面熄诡,用的是ant-design-pro進行的二次開發(fā),遇到的坑還是很多的,因此接下來分享的內(nèi)容大多都是和ant-design有關(guān)的,經(jīng)驗都來自于自己的填坑之旅商蕴。本篇我們來講講怎么實現(xiàn)Modal組件的全屏功能。

我們希望實現(xiàn)一下功能

  • 用戶能夠通過全屏控制圖標進行全屏及非全屏操作
  • 支持初始全屏彈窗芝发,支持隱藏全屏控制圖標

尋找圖標嵌入點

按照慣例绪商,全屏控制圖標都是放置在彈窗的頭部區(qū)域,靠近關(guān)閉按鈕附近辅鲸。在瀏覽過官方組件使用文檔之后格郁,大致發(fā)現(xiàn)有兩個地方可以實現(xiàn)此功能。

  • closeIcon
    此屬性可以實現(xiàn)自定義關(guān)閉圖標独悴,我們在此處可以插入兩個圖標例书,一個用于關(guān)閉,一個用來控制全屏操作刻炒,同時防止全屏操作觸發(fā)關(guān)閉指令决采,我們應(yīng)該在后者的點擊事件中阻止事件的冒泡。
  • title
    此屬性用來展示標題內(nèi)容坟奥。我們注意到它不僅支持字符串树瞭,也支持ReactNode類型的數(shù)據(jù)暂幼,因此我們可以在此處實現(xiàn)自定義圖標,并通過樣式控制懸浮到頭部右側(cè)移迫。

嵌入控制圖標

此處我們選擇title屬性來實現(xiàn)旺嬉,通過增加一個中間層在用戶傳入的title中添加一個全屏控制彈窗

const { title } = this.props;
return (
      <>
        {title}
          <button
            type="button"
            className="ant-modal-close"
            style={{ right: 42 }}
          >
            <span className="ant-modal-close-x">
              <Icon className="ant-modal-close-icon" type="arrows-alt" />
            </span>
          </button>
      </>
    );

上述代碼中的全屏控制按鈕copy自彈窗中的關(guān)閉按鈕,唯一的不同就是圖標的位置及圖標類型厨埋。我們將上述代碼封裝成一個函數(shù)邪媳,將其執(zhí)行結(jié)果賦予modaltitle屬性。
實現(xiàn)效果如下:

實現(xiàn)全屏控制功能

上述我們提到要實現(xiàn)用戶能夠自由控制全屏及退出全屏的功能荡陷。因此我們定義一個名為fullScreenstate屬性來控制當前的彈窗狀態(tài)雨效。

// 切換當前全屏狀態(tài)
toggleFullScreen = () => {
    const { fullScreen } = this.state;
    this.setState({
      fullScreen: !fullScreen,
    });
  };

titleRender = () => {
  const { title } = this.props;
  const { fullScreen } = this.state;
  return (
      <>
        {title}
          <button
            type="button"
            className="ant-modal-close"
            style={{ right: 42 }}
            onClick={this.toggleFullScreen}
          >
            <span className="ant-modal-close-x">
              <Icon className="ant-modal-close-icon" type={fullScreen ? 'shrink' : 'arrows-alt'} />
            </span>
          </button>
      </>
    );
  };

同時我們希望通過css來控制全屏的樣式,因此我們需要通過上述fullScreen來給予modal不同的樣式名废赞。

const { fullScreen } = this.state;
render() {
  <Modal
                wrapClassName={`${fullScreen ? 'modal-wrap-fullscreen' : ''}`}
                title={this.titleRender()}
                {...rest}
 />
}

上述代碼我們通過modal-wrap-fullscreen來控制全屏的時候的樣式徽龟,這邊需要css控制的樣式主要有:

  • 控制modal高度為瀏覽器可視區(qū)域高度,這邊可以通過100vh來實現(xiàn)唉地,寬度為100%即可
  • 控制modalbody高度為瀏覽器可視區(qū)域高度 - 頭部區(qū)域高度 - 底部區(qū)域高度据悔。這邊如果需要實現(xiàn)無底部區(qū)域等情況,還可以繼續(xù)細分賦予Modal不同的wrapClassName來控制
  • 可以將邊角由圓角改成直角

其它控制參數(shù)

  • 默認全屏功能
    要實現(xiàn)默認全屏功能耘沼,那么用戶得傳入一個參數(shù)表明默認全屏极颓。此處我們同樣在props增加一個參數(shù)名為fullScreen的參數(shù),并且state中的初始值由props中的參數(shù)決定即可群嗤。
  • 隱藏控制圖標
    同樣我們增加一個名為maxmin的屬性來控制
titleRender = () => {
  const { title, maxmin } = this.props;
  const { fullScreen } = this.state;
  return (
      <>
        {title}
        {maxmin && (
          <button
            type="button"
            className="ant-modal-close"
            style={{ right: 42 }}
            onClick={this.toggleFullScreen}
          >
            <span className="ant-modal-close-x">
              <Icon className="ant-modal-close-icon" type={fullScreen ? 'shrink' : 'arrows-alt'} />
            </span>
          </button>
        )}
      </>
    );
  };

結(jié)語

上述代碼只是為了說明實現(xiàn)思路作為參考菠隆,可能并不完整。詳細可以查看我托管的代碼狂秘,當然我封裝的代碼中實現(xiàn)的功能會更多一點骇径,具體可以看這

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末者春,一起剝皮案震驚了整個濱河市破衔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌碧查,老刑警劉巖运敢,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件校仑,死亡現(xiàn)場離奇詭異忠售,居然都是意外死亡,警方通過查閱死者的電腦和手機迄沫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門稻扬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人羊瘩,你說我怎么就攤上這事泰佳∨慰常” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵逝她,是天一觀的道長浇坐。 經(jīng)常有香客問我,道長黔宛,這世上最難降的妖魔是什么近刘? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮臀晃,結(jié)果婚禮上觉渴,老公的妹妹穿的比我還像新娘。我一直安慰自己徽惋,他們只是感情好案淋,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著险绘,像睡著了一般踢京。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宦棺,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天漱挚,我揣著相機與錄音,去河邊找鬼渺氧。 笑死旨涝,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的侣背。 我是一名探鬼主播白华,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼贩耐!你這毒婦竟也來了弧腥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤潮太,失蹤者是張志新(化名)和其女友劉穎管搪,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體铡买,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡更鲁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了奇钞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片澡为。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖景埃,靈堂內(nèi)的尸體忽然破棺而出媒至,到底是詐尸還是另有隱情顶别,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布拒啰,位于F島的核電站驯绎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏谋旦。R本人自食惡果不足惜条篷,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蛤织。 院中可真熱鬧赴叹,春花似錦、人聲如沸指蚜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽摊鸡。三九已至绽媒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間免猾,已是汗流浹背是辕。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留猎提,地道東北人获三。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像锨苏,于是被迫代替她去往敵國和親疙教。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容