美文网首页
react实现antd Notification组件

react实现antd Notification组件

作者: 下凉风 | 来源:发表于2020-07-11 22:24 被阅读0次

    antd有个Notification组件用于全局通知提醒, 现在用react实现一个相同的组件。


    image.png

    思考这个组件:

    • 全局提示 ,即在任何地方都可以通过方法调用
    • 如何将组件渲染到页面上

    定义方法名称为toast,可以知道在使用时,只要调用toast() 就会在页面上出现提示,几秒后提示消失,也可以手动关闭
    该类组件一般会有一些像success,error ,warning的分类,所以调用的形式是toast.success('提示文案')

    一、第一步:dom实现

    const dispatchToast = (toast, type) => {
      let item = { toast, type }
      if (containerDomNode) {
        //当containerDomNode存在时,不重新createElement
        globalControl.add(item)
      } else {
        containerDomNode = document.createElement('div')
        document.body.appendChild(containerDomNode)
        //ToastContainer是提示组件
        ReactDOM.render(<ToastContainer initToast={item} />, containerDomNode)
      }
    }
    
    export default {
      success: v => dispatchToast(v, 'success'),
      error: v => dispatchToast(v, 'error'),
      warning: v => dispatchToast(v, 'warning')
    }
    

    globalControl是一个全局的控制器, 用于控制组件的数量
    containerDomNode是一个全局变量,是用于放置组件的面板

    第二步:实现ToastContainer

    const ToastContainer = ({ initToast }) => {
      const [queue] = useQueue()
    
      useEffect(() => {
        if (initToast) {
          globalControl.add(initToast)
        }
      }, [])
    
      return (
        <div className={styles.container}>
          {queue.map(el => (
            <p
              className={`${styles.item} ${styles[el.type]}`}
              key={el._tid}
              onClick={() => globalControl.rm(el._tid)}
            >
              {el.content}
            </p>
          ))}
        </div>
      )
    }
    

    queue就是toast的数量
    第三步:自定义useQueue勾子

    
    // toast标识符计数器
    let tid = 0
    let globalControl = {}
    let containerDomNode = undefined
    // 默认配置
    const defaultOption = {
      duration: 3000,
      content: 'this is default content!'
    }
    const useQueue = () => {
      const [queue, setQueue] = useState([])
      const add = (item = {}) => {
        const _tid = getName()
        item = Object.assign({ _tid }, defaultOption, item)
        setQueue(v => [...v, item])
        setTimeout(() => rm(item._tid), item.duration)
      }
      const rm = tid => {
        setQueue(v => v.filter(el => el._tid !== tid))
      }
      const getName = () => `__toast_id_${++tid}`
      const control = {
        add,
        rm
      }
      globalControl = control
      return [queue]
    }
    

    相关文章

      网友评论

          本文标题:react实现antd Notification组件

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