成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

React組件庫(kù)封裝初探--Modal

codecraft / 1060人閱讀

摘要:組件實(shí)現(xiàn)基本簡(jiǎn)介類(lèi)似于實(shí)現(xiàn)的組件,首先基本結(jié)構(gòu)分析遮罩層內(nèi)容包裝層主體內(nèi)容層,包含固定定位布局,全屏遮蓋顯示,所以?xún)?nèi)容自定義實(shí)現(xiàn)功能目標(biāo)兩種調(diào)用方式一些內(nèi)容遮罩層和的顯示與否,單擊是否可關(guān)閉其他必備功能結(jié)構(gòu)布局攻克基本布局遮

Madal組件實(shí)現(xiàn)基本簡(jiǎn)介

類(lèi)似于antd實(shí)現(xiàn)的modal組件,首先基本結(jié)構(gòu)分析:

modal-mask遮罩層

modal-warp內(nèi)容包裝層

modal主體內(nèi)容層,包含:titlecontent、footer、close-btn

固定定位布局,全屏遮蓋顯示,所以?xún)?nèi)容自定義

實(shí)現(xiàn)功能目標(biāo):

兩種調(diào)用方式一些內(nèi)容、Modal.confirm({...props})

遮罩層、footerclose-btn的顯示與否,單擊是否可關(guān)閉

其他必備功能

結(jié)構(gòu)布局攻克

基本布局

// 遮罩層需要實(shí)現(xiàn)全屏遮罩 // 內(nèi)容層高度可自定義
// 右上角關(guān)閉按鈕
+
} // 主內(nèi)容
//title標(biāo)題
{title}
//body用戶(hù)輸入內(nèi)容
{children}
// footer底部按鈕

遮罩層全屏覆蓋

position: fixed定位

全屏實(shí)現(xiàn)

    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    z-index: 1000;

內(nèi)容層

position: fixed定位(modal-warp層)

warp層的布局大小考慮

全屏:如果warp層實(shí)現(xiàn)全屏,由于和mask層為兄弟組件,導(dǎo)致warp層位于mask層之上,后面對(duì)mask層單擊可關(guān)閉功能易出現(xiàn)單擊不到,因?yàn)楸蝗恋膚arp層遮擋(可考慮使用事件委托,將單擊事件綁定至第一個(gè)父組件,通過(guò)判斷去除modal層的單擊,雖然單擊的還是warp層);

大小跟隨modal:及設(shè)置warp層的大小剛好為其內(nèi)容modal,這樣就不會(huì)覆蓋全部mask層,但是,后期對(duì)傳入設(shè)置是否顯示mask層的功能有所影響(因?yàn)閣arp層不全屏,如果mask設(shè)置不顯示,會(huì)導(dǎo)致用戶(hù)可以操作到底下主內(nèi)容),可考慮mask的顯隱通過(guò)visibility: hidden控制.


基本功能邏輯實(shí)現(xiàn)

基本對(duì)外接口(函數(shù)式)

const Modal = ({
    visible=false,
    style,
    width= 520,
    zIndex=1000,
    centered=false,
    title="title",
    footer,
    wrapClassName="",
    okText="確定",
    okType="primary",
    cancelText="取消",
    cancelType="default",
    closable= true,
    onOk=() => {},
    onCancel=() => {},
    mask=true,
    maskClosable= true,
    children="Basic body"
}) => {
    return (
        visible ?
        ReactDOM.createPortal(
....
,document.querySelector("body")) : null ) }

組件采用函數(shù)無(wú)狀態(tài)編程,Modal的顯隱由外部控制,內(nèi)部不控制;

組件的掛載使用ReactDOM.createPortal(child,container)掛載至body

基本使用形式

import React,{ PureComponent } from "react";
import { Modal,Button } from "lwh_react";

export default class baseModal extends PureComponent {
    state = {
        visible: false
    }

    showModal = () => {
        this.setState({
            visible: true
        })
    }
    onCancel = () => {
        console.log("cancel")
        this.setState({
            visible: false
        })
    }
    onOk = () => {
        console.log("ok")
        this.setState({
            visible: false
        })
    }

    render() {
        const { visible } = this.state;
        return (
            
簡(jiǎn)單基本用法:
modal提示內(nèi)容
) } }

效果


升級(jí)篇Modal.method()的攻克

如何實(shí)現(xiàn)類(lèi)似antd中modal.method的方法調(diào)用彈窗形式(且調(diào)用后返回一個(gè)引用包含{update, destroy}可控制彈窗):

Modal.info({...})

Modal.success({...})

Modal.error({...})

Modal.warning({...})

Modal.confirm({...})

method()是Modal的方法即先給組件Modal增加對(duì)應(yīng)方法,返回一個(gè)對(duì)象;

通過(guò)在method(props)方法中將其方法參數(shù)作為組件Modal的props傳入,并render(Modal);

需要返回一個(gè)對(duì)象包含{update, destroy}基本代碼如下:

["confirm","info","success","error","warning"].forEach(item => {
    // eslint-disable-next-line react/no-multi-comp
    Modal[item] = ({ ...props}) => {
        let div = document.createElement("div");
        let currentConfig = Object.assign({}, props);
        document.body.appendChild(div);
        // 使用高階組件剔除Method()調(diào)用形式不可配置的props和默認(rèn)值
        const FunModal = HOCModal(Modal);
        // 關(guān)閉
        const destroy = () => {
            const unmountResult = ReactDOM.unmountComponentAtNode(div);
            if (unmountResult && div.parentNode) {
                div.parentNode.removeChild(div);
            }
        }
        const render = (config) => {
            //name傳入調(diào)用的方法名,用于區(qū)分使用不同footer和Icon
            ReactDOM.render(, div);
        }
        // 更新
        const update = (newConfig) => {
            currentConfig = Object.assign({}, currentConfig,newConfig);
            render(currentConfig);
        }
        render(currentConfig);
        return {
            destroy: destroy,
            update: update
        }
    }
});

因?yàn)?b>Modal.method()調(diào)用形式可使用的配置props與中的配置項(xiàng)和默認(rèn)值有所不同;

Modal.confirm({})中不可配置footer;Modal.info({})footer底部默認(rèn)應(yīng)該為一個(gè)button,且默認(rèn)值為我知道了;

再如Modal.method()不需要傳遞visible,而形式需要傳入;

再比如Modal.method()中沒(méi)有children,而使用content作為內(nèi)容的傳遞,所以需要適配下;

所以這里考慮使用一個(gè)高階組件HocModal對(duì)傳給Modal的props進(jìn)行部分剔除和默認(rèn)值修改

const HOCModal = (Component) => {
    //剔除出visible,footer,closable,使其不可配,賦予永久默認(rèn)值
    return ({
        visible,
        footer,
        closable,
        okText="知道了",
        okType="primary",
        onOk=() => {},
        onCancel=() => {},
        maskClosable= false,
        content="Basic body",
        name,
        destroy,
        ...props
    }) => {
        // 修改onOk方法傳入關(guān)閉Modal方法destroy();
        const onOk_1 = () => {
            onOk();
            destroy();
        }
        // 修改onCancel方法傳入關(guān)閉Modal方法destroy();
        const onCancel_1 = () => {
            onCancel();
            destroy();
        }
        // Modal底部footer固定使用這里為默認(rèn)值,且不可自定義footer,如果調(diào)用的是confirm返回undefined走M(jìn)odal的默認(rèn)配置,其他則只顯示一個(gè)OK、button
        // eslint-disable-next-line react/no-multi-comp
        const Footer = () => (
            name == "confirm" ? undefined : 
        )
        return (
        
    )
    }
}

使用測(cè)試

const ModalConfirm = () => {
    const onInfo = () => {
        Modal.info({
        title: "Info",
        content: (
          

some messages...some messages...

some messages...some messages...

), onOk() {} }); } const showDeleteConfirm = () => { const modal = Modal.confirm({ title: "你確定需要?jiǎng)h除該項(xiàng)么?", content: "一些刪除提示內(nèi)容", okText: "刪除", okType: "danger", cancelText: "取消", onOk() { console.log("OK"); }, onCancel() { console.log("Cancel"); } }); console.log(modal); } return (
) }

結(jié)果展示

其他優(yōu)化

顯隱的動(dòng)畫(huà)過(guò)渡;

組件的保留,這里只實(shí)現(xiàn)了關(guān)閉即摧毀;優(yōu)化為可選擇不摧毀只是隱藏;

支持異步加載關(guān)閉

“積跬步、行千里”—— 持續(xù)更新中~,喜歡的話(huà)留下個(gè)贊和關(guān)注哦!

往期經(jīng)典好文:

你不知道的CORS跨域資源共享

性能優(yōu)化篇---Webpack構(gòu)建速度優(yōu)化

團(tuán)隊(duì)合作必備的Git操作

使用pm2部署node生產(chǎn)環(huán)境

下期考慮Carousel走馬燈封裝

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/54727.html

相關(guān)文章

  • React組件庫(kù)封裝初探--Modal

    摘要:組件實(shí)現(xiàn)基本簡(jiǎn)介類(lèi)似于實(shí)現(xiàn)的組件,首先基本結(jié)構(gòu)分析遮罩層內(nèi)容包裝層主體內(nèi)容層,包含固定定位布局,全屏遮蓋顯示,所以?xún)?nèi)容自定義實(shí)現(xiàn)功能目標(biāo)兩種調(diào)用方式一些內(nèi)容遮罩層和的顯示與否,單擊是否可關(guān)閉其他必備功能結(jié)構(gòu)布局攻克基本布局遮 Madal組件實(shí)現(xiàn)基本簡(jiǎn)介 showImg(https://segmentfault.com/img/bVbqhvl?w=1848&h=834); 類(lèi)似于an...

    ybak 評(píng)論0 收藏0
  • React Native 常用的 15 個(gè)庫(kù)

    摘要:聲明式用法只需使用動(dòng)畫(huà)的名稱(chēng),該動(dòng)畫(huà)將在加載該元素時(shí)立即生效。實(shí)際案例這個(gè)庫(kù)支持本地推送通知功能比較全面。實(shí)際案例具有縮放支持,回調(diào),縮放以適應(yīng)和滾動(dòng)指示器支持的組件。這是圖像上傳或圖像處理的基本庫(kù)。 本篇 React native 庫(kù)列表不是從網(wǎng)上隨便找的, 這些是我在我的應(yīng)用中親自使用的庫(kù)。 這些庫(kù)功能可能跟其它庫(kù)也有,但經(jīng)過(guò)大量研究并在我的程序中嘗試后,我選擇了這些庫(kù)。 想閱讀更...

    Juven 評(píng)論0 收藏0
  • React造輪系列:對(duì)話(huà)框組件 - Dialog 思路

    摘要:本文是造輪系列第二篇。實(shí)現(xiàn)方式事件處理跟差不多,唯一多了一步就是當(dāng)點(diǎn)擊或者的時(shí)候,如果外部有回調(diào)就需要調(diào)用對(duì)應(yīng)的回調(diào)函數(shù)。 本文是React造輪系列第二篇。 1.React 造輪子系列:Icon 組件思路 本輪子是通過(guò) React + TypeScript + Webpack 搭建的,至于環(huán)境的搭建這邊就不在細(xì)說(shuō)了,自己動(dòng)手谷歌吧。當(dāng)然可以參考我的源碼。 想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳Git...

    qianfeng 評(píng)論0 收藏0
  • 基于Redux架構(gòu)的單頁(yè)應(yīng)用開(kāi)發(fā)總結(jié)

    摘要:系統(tǒng)架構(gòu)介紹本項(xiàng)目開(kāi)發(fā)基于框架,利用進(jìn)行模塊化構(gòu)建,前端編寫(xiě)語(yǔ)言是,利用進(jìn)行轉(zhuǎn)換。單頁(yè)是為單頁(yè)應(yīng)用量身定做的你可以把拆成很多,這些由路由來(lái)加載。前者用來(lái)獲取的狀態(tài),后者用來(lái)修改的狀態(tài)。 系統(tǒng)架構(gòu)介紹 本項(xiàng)目開(kāi)發(fā)基于 React + Redux + React-Route 框架,利用 webpack 進(jìn)行模塊化構(gòu)建,前端編寫(xiě)語(yǔ)言是 JavaScript ES6,利用 babel進(jìn)行轉(zhuǎn)換。...

    fish 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<