摘要:組件實現基本簡介類似于實現的組件,首先基本結構分析遮罩層內容包裝層主體內容層,包含固定定位布局,全屏遮蓋顯示,所以內容自定義實現功能目標兩種調用方式一些內容遮罩層和的顯示與否,單擊是否可關閉其他必備功能結構布局攻克基本布局遮
Madal組件實現基本簡介
類似于antd實現的modal組件,首先基本結構分析:
modal-mask遮罩層
modal-warp內容包裝層
modal主體內容層,包含:title、content、footer、close-btn
固定定位布局,全屏遮蓋顯示,所以內容自定義
實現功能目標:
兩種調用方式
遮罩層、footer和close-btn的顯示與否,單擊是否可關閉
其他必備功能
結構布局攻克基本布局
// 遮罩層需要實現全屏遮罩 // 內容層高度可自定義// 右上角關閉按鈕+} // 主內容//title標題//body用戶輸入內容{title}{children}// footer底部按鈕
遮罩層全屏覆蓋
position: fixed定位
全屏實現
top: 0; right: 0; bottom: 0; left: 0; z-index: 1000;
內容層
position: fixed定位(modal-warp層)
warp層的布局大小考慮
全屏:如果warp層實現全屏,由于和mask層為兄弟組件,導致warp層位于mask層之上,后面對mask層單擊可關閉功能易出現單擊不到,因為被全屏的warp層遮擋(可考慮使用事件委托,將單擊事件綁定至第一個父組件,通過判斷去除modal層的單擊,雖然單擊的還是warp層);
大小跟隨modal層:及設置warp層的大小剛好為其內容modal,這樣就不會覆蓋全部mask層,但是,后期對傳入設置是否顯示mask層的功能有所影響(因為warp層不全屏,如果mask設置不顯示,會導致用戶可以操作到底下主內容),可考慮mask的顯隱通過visibility: hidden控制.
基本功能邏輯實現基本對外接口(函數式)
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 ) }
組件采用函數無狀態編程,Modal的顯隱由外部控制,內部不控制;
組件的掛載使用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 (簡單基本用法:) } } modal提示內容
效果
升級篇Modal.method()的攻克
如何實現類似antd中modal.method的方法調用彈窗形式(且調用后返回一個引用包含{update, destroy}可控制彈窗):
Modal.info({...})
Modal.success({...})
Modal.error({...})
Modal.warning({...})
Modal.confirm({...})
method()是Modal的方法即先給組件Modal增加對應方法,返回一個對象;
通過在method(props)方法中將其方法參數作為組件Modal的props傳入,并render(Modal);
需要返回一個對象包含{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()調用形式不可配置的props和默認值 const FunModal = HOCModal(Modal); // 關閉 const destroy = () => { const unmountResult = ReactDOM.unmountComponentAtNode(div); if (unmountResult && div.parentNode) { div.parentNode.removeChild(div); } } const render = (config) => { //name傳入調用的方法名,用于區分使用不同footer和Icon ReactDOM.render(, div); } // 更新 const update = (newConfig) => { currentConfig = Object.assign({}, currentConfig,newConfig); render(currentConfig); } render(currentConfig); return { destroy: destroy, update: update } } });
因為Modal.method()調用形式可使用的配置props與
如Modal.confirm({})中不可配置footer;Modal.info({})的footer底部默認應該為一個button,且默認值為我知道了;
再如Modal.method()不需要傳遞visible,而
再比如Modal.method()中沒有children,而使用content作為內容的傳遞,所以需要適配下;
所以這里考慮使用一個高階組件HocModal對傳給Modal的props進行部分剔除和默認值修改
const HOCModal = (Component) => { //剔除出visible,footer,closable,使其不可配,賦予永久默認值 return ({ visible, footer, closable, okText="知道了", okType="primary", onOk=() => {}, onCancel=() => {}, maskClosable= false, content="Basic body", name, destroy, ...props }) => { // 修改onOk方法傳入關閉Modal方法destroy(); const onOk_1 = () => { onOk(); destroy(); } // 修改onCancel方法傳入關閉Modal方法destroy(); const onCancel_1 = () => { onCancel(); destroy(); } // Modal底部footer固定使用這里為默認值,且不可自定義footer,如果調用的是confirm返回undefined走Modal的默認配置,其他則只顯示一個OK、button // eslint-disable-next-line react/no-multi-comp const Footer = () => ( name == "confirm" ? undefined : ) return () } }
使用測試
const ModalConfirm = () => { const onInfo = () => { Modal.info({ title: "Info", content: (), onOk() {} }); } const showDeleteConfirm = () => { const modal = Modal.confirm({ title: "你確定需要刪除該項么?", content: "一些刪除提示內容", okText: "刪除", okType: "danger", cancelText: "取消", onOk() { console.log("OK"); }, onCancel() { console.log("Cancel"); } }); console.log(modal); } return (some messages...some messages...
some messages...some messages...
) }
結果展示
其他優化顯隱的動畫過渡;
組件的保留,這里只實現了關閉即摧毀;優化為可選擇不摧毀只是隱藏;
支持異步加載關閉
“積跬步、行千里”—— 持續更新中~,喜歡的話留下個贊和關注哦!
往期經典好文:
你不知道的CORS跨域資源共享
性能優化篇---Webpack構建速度優化
團隊合作必備的Git操作
使用pm2部署node生產環境
下期考慮Carousel走馬燈封裝
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/102874.html
摘要:組件實現基本簡介類似于實現的組件,首先基本結構分析遮罩層內容包裝層主體內容層,包含固定定位布局,全屏遮蓋顯示,所以內容自定義實現功能目標兩種調用方式一些內容遮罩層和的顯示與否,單擊是否可關閉其他必備功能結構布局攻克基本布局遮 Madal組件實現基本簡介 showImg(https://segmentfault.com/img/bVbqhvl?w=1848&h=834); 類似于an...
摘要:聲明式用法只需使用動畫的名稱,該動畫將在加載該元素時立即生效。實際案例這個庫支持本地推送通知功能比較全面。實際案例具有縮放支持,回調,縮放以適應和滾動指示器支持的組件。這是圖像上傳或圖像處理的基本庫。 本篇 React native 庫列表不是從網上隨便找的, 這些是我在我的應用中親自使用的庫。 這些庫功能可能跟其它庫也有,但經過大量研究并在我的程序中嘗試后,我選擇了這些庫。 想閱讀更...
摘要:本文是造輪系列第二篇。實現方式事件處理跟差不多,唯一多了一步就是當點擊或者的時候,如果外部有回調就需要調用對應的回調函數。 本文是React造輪系列第二篇。 1.React 造輪子系列:Icon 組件思路 本輪子是通過 React + TypeScript + Webpack 搭建的,至于環境的搭建這邊就不在細說了,自己動手谷歌吧。當然可以參考我的源碼。 想閱讀更多優質文章請猛戳Git...
摘要:系統架構介紹本項目開發基于框架,利用進行模塊化構建,前端編寫語言是,利用進行轉換。單頁是為單頁應用量身定做的你可以把拆成很多,這些由路由來加載。前者用來獲取的狀態,后者用來修改的狀態。 系統架構介紹 本項目開發基于 React + Redux + React-Route 框架,利用 webpack 進行模塊化構建,前端編寫語言是 JavaScript ES6,利用 babel進行轉換。...
閱讀 2000·2021-09-13 10:23
閱讀 2332·2021-09-02 09:47
閱讀 3792·2021-08-16 11:01
閱讀 1214·2021-07-25 21:37
閱讀 1597·2019-08-30 15:56
閱讀 521·2019-08-30 13:52
閱讀 3127·2019-08-26 10:17
閱讀 2442·2019-08-23 18:17