美文网首页
React 如何设计一个弹窗组件

React 如何设计一个弹窗组件

作者: baby熊_熊姐 | 来源:发表于2017-07-19 21:03 被阅读3045次

    需求

    • 弹窗出现时,固定在屏幕中间
    • 弹窗中标题、内容文字自定义
    • 取消按钮可选
    • 点击关闭按钮,弹窗消失
    • 点击确定,Resolve 函数被执行,弹窗消失
    • 该弹窗采用一个函数形式被调用,返回一个Promise, 在then 中执行确定后的逻辑

    弹窗设计

    鉴于以上需求,将整个弹窗拆分为一个UI组件(Dialog),一个处理函数部分(Staticize)

    Dialog

    Props

    • title:弹窗标题
    • message:内容信息
    • onConfirm: 确认时调用的函数,
    • onCancel:点击关闭或取消时,调用的函数
    import React from 'react'
    import cx from 'classnames'
    import SVGIcon from 'components/SVGIcon'
    import styles from './Dialog.scss'
    
    const Dialog = ({
      title,
      message,
      onConfirm,
      onCancel,
    }) => (
      <div className={styles.root}>
        <div className={styles.header}>
          <SVGIcon
            className={styles.icon}
            name="dialog/warning"
            width="32"
            height="32"
          />
          <div className={styles.title}>{title}</div>
        </div>
        <div className={styles.message}>{message}</div>
        <div className={styles.buttons}>
            <button className={styles.button} onClick={onCancel}>
               取消
            </button>
          <button className={cx(styles.button, styles.active)} onClick={onConfirm}>
            确定
          </button>
        </div>
      </div>
    )
    
    export default Dialog
    

    Staticize

    Props

    • title:弹窗标题
    • message:内容信息

    函数行为

    • 返回一个Promise 对象,接收一个 fullfill
      作为 Resolve 时参数。
    • 创建一个div, 并添加到 body 中,在该 div 中渲染出 Dialog。
    • close 函数移除该 div, 并作为Dialog 的 onCancel 属性
    • onConfirm 中 执行 fullfill 和 close
    import React from 'react'
    import ReactDOM from 'react-dom'
    import Dialog from './Dialog'
    
    const staticize = props =>
      new Promise((fulfill) => { // 此处参数需用圆括号,否则 eslint 报错
        const holder = document.createElement('div')
        document.body.appendChild(holder)
    
        const close = () => {
          document.body.removeChild(holder)
        }
    
        ReactDOM.render(
          <Dialog
            {...props}
            onCancel={close}
            onConfirm={() => {
              close()
              fulfill()
            }}
          />,
          holder
        )
      })
    
    export default staticize
    

    相关文章

      网友评论

          本文标题:React 如何设计一个弹窗组件

          本文链接:https://www.haomeiwen.com/subject/yvrrkxtx.html