摘要:組件實(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)容層,包含:title、content、footer、close-btn
固定定位布局,全屏遮蓋顯示,所以?xún)?nèi)容自定義
實(shí)現(xiàn)功能目標(biāo):
兩種調(diào)用方式
遮罩層、footer和close-btn的顯示與否,單擊是否可關(guān)閉
其他必備功能
結(jié)構(gòu)布局攻克基本布局
// 遮罩層需要實(shí)現(xiàn)全屏遮罩 // 內(nèi)容層高度可自定義// 右上角關(guān)閉按鈕+} // 主內(nèi)容//title標(biāo)題//body用戶(hù)輸入內(nèi)容{title}{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控制.
基本對(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)容
效果
如何實(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與
如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: (), 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 (some messages...some messages...
some messages...some messages...
) }
結(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
摘要:組件實(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...
摘要:聲明式用法只需使用動(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ù)。 想閱讀更...
摘要:本文是造輪系列第二篇。實(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...
摘要:系統(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)換。...
閱讀 1132·2021-11-16 11:42
閱讀 2913·2021-10-12 10:18
閱讀 2870·2021-09-24 09:48
閱讀 3475·2019-08-30 15:56
閱讀 1542·2019-08-30 14:17
閱讀 3053·2019-08-29 12:14
閱讀 918·2019-08-27 10:51
閱讀 2037·2019-08-26 13:28