要求: 组件讲究的是复用性,和可移植性。css
可复用:就是要作到组件逻辑功能和业务逻辑功能互不影响也就是所谓的解藕。html
可移植:就是要作到软件(组件)与系统无关,也就是没有外部依赖。react
纯函数组件也称无状态组件在这里获得了很好的应用。git
最简单的纯函数组件github
const text = props=><span>{props.text}</span>
复制代码
思路: Modal 的实现思路极其简单api
const Modal = props=>props.visibale ? <MyModal/> : null
复制代码
数据采用从父组件接收 props 的方式获取而不采用 state 能实现 Modal 组件视图与数据的分离,除了耦合从而达到了可复用的目的。数组
只需将 props 中的函数
title (标题)oop
content (内容)flex
onOk (确认事件)
onCancel (取消事件)
按照必定的逻辑放置在 Modal 中便可
(固然还有其余的参数好比 width height 就不一一列举)
如下是个人实现:
实现:
Modal.jsx 文件
import React from 'react'
import './Modal.css'
const Modal = props => props.visible ? (<div className="modal-box" style={{backgroundColor:`rgba(0, 0, 0, ${props.opacity})`}}> <div className="modal-content" style={{width:props.width,height:props.height}}> <div className={props.titleClass}>{props.title}</div> <div className={props.contentClass}>{props.content}</div> <div className={props.footerClass}> <div onClick={props.onOk} className={props.okClass}>{props.conFirmText}</div> <div onClick={props.onCancel} className={props.cancelClass}>{props.cancelText}</div> </div> </div> </div>) : null
const noop = _=> undefined
Modal.defaultProps = {
onOk: noop,
onCancel: noop,
conFirmText: '肯定',
cancelText: '取消',
titleClass: 'modal-title',
contentClass: 'modal-text',
footerClass: 'modal-footer',
okClass: 'modal-confirm',
cancelClass: 'modal-cancel',
height:'auto',
width:'400px',
opacity: 0.6
}
export default Modal
复制代码
Modal.css 文件
.modal-box {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: 9999;
/* background-color: rgba(0, 0, 0, 0.8); */
display: flex;
justify-content: center;
align-items: center;
}
.modal-content {
position: relative;
min-width: 400px;
background-color: white;
padding: 40px;
box-sizing: border-box;
}
.modal-title{
font-weight: bold;
font-size: 22px
}
.modal-text {
font-size: 16px;
}
.modal-footer {
}
.modal-confirm,.modal-cancel {
width: 100px;
height: 30px;
line-height: 30px;
text-align: center;
cursor: pointer;
position: absolute;
bottom: 40px;
}
.modal-confirm {
left: 40px;
}
.modal-cancel {
right: 40px;
}
复制代码
使用方式:
属性 | 说明 | 默认值 | 类型 |
---|---|---|---|
onOk | 点击肯定的回调函数 | noop | function |
onCancel | 点击取消的回调函数 | noop | function |
conFirmText | 肯定按钮自定义文字 | '肯定' | string |
cancelText | 取消按钮自定义文字 | '取消' | string |
titleClass | 对话框 title 自定义样式 | 'modal-title' | string |
contentClass | 对话框内容自定义样式 | 'modal-text' | string |
footerClass | 对话框肯定取消按钮容器自定义样式 | 'modal-footer | string |
okClass | 对话框肯定按钮自定义样式 | 'modal-confirm' | string |
cancelClass | 对话框取消按钮自定义样式 | 'modal-cancel' | string |
height | 对话框宽度 | 'auto' | string |
width | 对话框高度 | '400px' | string |
opacity | 对话框透明度 | 0.6 | nunmber |
demo.js 文件
import React, { Component } from 'react';
import './App.css';
import Modal from './Modal/Modal.jsx'
class App extends Component {
constructor(){
super()
this.state = {
title: 'React Modal',
content: '欢迎使用!',
visible: false
}
}
openModal(){
this.setState({
visible: true
})
}
onOk(){
this.setState({
visible:false
})
}
onCancel(){
this.setState({
visible:false
})
}
render() {
return (
<div className="App"> <div onClick={this.openModal.bind(this)}>开启弹窗</div> <Modal width={'600px'} height={'600px'} visible={this.state.visible} title={this.state.title} content={this.state.content} onOk={this.onOk.bind(this)} opacit={0.66} onCancel={this.onCancel.bind(this)}/> </div> ); } } export default App; 复制代码