1. import React, { useState, useRef, useEffect } from 'react'
  2. import PropTypes from 'prop-types'
  3. import _ from 'lodash'
  4. import uuidv1 from 'uuid/v1'
  5.  
  6. import './index.less'
  7.  
  8. let currentTipComponents = []
  9. let setCurrentTipComponents
  10.  
  11. function GlobalTipContainer(props) {
  12. const { style } = props
  13. const wrapperStyle = _.assign({}, style)
  14.  
  15. const [tipComponents, setTipComponents] = useState([])
  16. currentTipComponents = tipComponents
  17. setCurrentTipComponents = setTipComponents
  18.  
  19. const [displayedTipComponents, setDisplayedTipComponents] = useState([])
  20. const [mouseHover, setMouseHover] = useState(false)
  21.  
  22. const wrapElemRef = useRef(null)
  23. useEffect(() => {
  24. if (mouseHover === false) {
  25. wrapElemRef.current.scrollTop = 10e10
  26. }
  27. })
  28.  
  29. useEffect(() => {
  30. setDisplayedTipComponents(tipComponents.slice(0, 2))
  31. }, [tipComponents])
  32.  
  33. return (
  34. <div
  35. className="global-tip-container-component-wrap"
  36. ref={wrapElemRef}
  37. onMouseEnter={() => {
  38. setMouseHover(true)
  39. }}
  40. onMouseLeave={() => {
  41. setMouseHover(false)
  42. }}
  43. style={wrapperStyle}
  44. >
  45. {displayedTipComponents}
  46. </div>
  47. )
  48. }
  49.  
  50. GlobalTipContainer.addTip = (tipComponent) => {
  51. const key = uuidv1()
  52. currentTipComponents = currentTipComponents.slice(0)
  53. currentTipComponents.push(React.cloneElement(tipComponent, {
  54. key,
  55. onClose: _.flow(tipComponent.props.onClose || _.noop, () => { GlobalTipContainer.removeTip(key) }),
  56. }))
  57. setCurrentTipComponents(currentTipComponents)
  58. return key
  59. }
  60.  
  61. GlobalTipContainer.removeTip = (key) => {
  62. const index = _.findIndex(currentTipComponents, ['key', key])
  63. if (index !== -1) {
  64. currentTipComponents.splice(index, 1)
  65. setCurrentTipComponents(currentTipComponents.slice(0))
  66. }
  67. }
  68.  
  69. GlobalTipContainer.propTypes = {
  70. style: PropTypes.object,
  71. }
  72.  
  73. GlobalTipContainer.defaultProps = {
  74. style: {},
  75. }
  76.  
  77. export default GlobalTipContainer

react实现提示消息容器,可以动态添加,删除内部子提示消息的更多相关文章

  1. Android 在布局容器中动态添加控件

    这里,通过一个小demo,就可以掌握在布局容器中动态添加控件,以动态添加Button控件为例,添加其他控件同样道理. 1.addView 添加控件到布局容器 2.removeView 在布局容器中删掉 ...

  2. 编辑 Ext 表格(一)——— 动态添加删除行列

    一.动态增删行 在 ext 表格中,动态添加行主要和表格绑定的 store 有关, 通过对 store 数据集进行添加或删除,就能实现表格行的动态添加删除.   (1) 动态添加表格的行  gridS ...

  3. 用Javascript动态添加删除HTML元素实例 (转载)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. js实现网页收藏功能,动态添加删除网址

    <html> <head> <title> 动态添加删除网址 </title> <meta charset="utf-8"&g ...

  5. jquery动态添加删除div--事件绑定,对象克隆

    我想做一个可以动态添加删除div的功能.中间遇到一个问题,最后在manong123.com开发文摘 版主的热心帮助下解答了(答案在最后) 使用到的jquery方法和思想就是:事件的绑定和销毁(unbi ...

  6. jQuery动态添加删除CSS样式

    jQuery框架提供了两个CSS样式操作方法,一个是追加样式addClass,一个是移除样式removeClass,下面通过一个小例子讲解用法. jQuery动态追加移除CSS样式 <!DOCT ...

  7. JS动态添加删除html

    本功能要求是页面传一个List 集合给后台而且页面可以动态添加删除html代码需求如下: 下面是jsp页面代码 <%@ page language="java" pageEn ...

  8. zookeeper动态添加/删除集群中实例(zookeeper 3.6)

    一,用来作为demo操作的zookeeper集群中的实例: 机器名:zk1 server.1=172.18.1.1:2888:3888 机器名:zk2 server.2=172.18.1.2:2888 ...

  9. C#控制IIS动态添加删除网站

    我的目的是在Winform程序里面,可以直接启动一个HTTP服务端,给下游客户连接使用. 查找相关技术,有两种方法: 1.使用C#动态添加网站应用到IIS中,借用IIS的管理能力来提供HTTP接口.本 ...

随机推荐

  1. GB28181技术基础之1 - SIP协议

    SIP 协议,即 会话初始协议(Session Initiation Protocol),是一个应用层的 点对点协议,用于初始.管理和终止网络中的语音和视频会话,是 GB28181 的核心之一. 按照 ...

  2. vmware配置双网卡

    最近在学习使用iptables做网关服务器,即SNAT设置 我们的宿主机有两块网卡,地址分别是: 192.168.6.108/24 192.168.66.119/24 我们的目标是在虚拟机VMware ...

  3. Docs-.NET-C#-指南-语言参考-预处理器指令:#pragma warning(C# 参考)

    ylbtech-Docs-.NET-C#-指南-语言参考-预处理器指令:#pragma warning(C# 参考) 1.返回顶部 1. #pragma warning(C# 参考) 2015/07/ ...

  4. Typescript中的可索引接口 类类型接口

    /* 5.typeScript中的接口 可索引接口 类类型接口 */ /* 接口的作用:在面向对象的编程中,接口是一种规范的定义,它定义了行为和动作的规范,在程序设计里面,接口起到一种限制和规范的作用 ...

  5. Python3基础 def 函数要先定义再调用

             Python : 3.7.3          OS : Ubuntu 18.04.2 LTS         IDE : pycharm-community-2019.1.3    ...

  6. [redis]带密码的客户端连接方法

    客户端连接方法: redis-cli -h localhost -p 6380 提供host为localhost,端口为6380   带密码的客户端连接方法一: redis-cli -h localh ...

  7. js Date.parse()时区问题

    比较两个时间,parse() 方法可解析一个日期时间字符串,并返回 1970/1/1 午夜距离该日期时间的毫秒数.Date.parse时间多了8小时. 正确的方法: var nowDate = Dat ...

  8. 带你进入异步Django+Vue的世界 - Didi打车实战

    https://www.jianshu.com/p/7e5f2090555d#!/xh?tdsourcetag=s_pcqq_aiomsg

  9. 触屏Tap模拟事件

    触屏的click因为有双击判断所以有200ms的延迟,zepto里的touch.js兼容不好所以tap也没法直接用. gibhub上有个fastclick太大了. 自己用touched写个简单的模拟t ...

  10. 【ARTS】01_41_左耳听风-201900819~201900825

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...